C++ 类与对象

ops/2024/12/22 20:40:15/

面向对象程序设计基本特点

 特点:

  • 抽象(数据抽象,行为抽象)
    数据抽象:int hour,int minute.....,车:长,宽,高....
    功能抽象:showTime(),setTime() .....车:刹车,加速....
  • 封装 


    private , public , protect
  • 继承(将已有的代码拉来编写新的类,使其变得更加具体更详细的说明,一般与特殊的关系)
  • 多态


定义:

class 类名称

{

 public :

          外部接口

  protected:

           保护型成员

  private:

            私有成员

 } ;


 访问权限:private , public , protected

对象

类名   对象名 :

Clock myClock ; // 声明了一个时钟类型的myClock

调用时

对象名 . 函数成员名

myClock . showTime () ; // 在类的外部只能访问共有成员,在类的成员函数中,可以访问类的全部成员

类的成员函数

  • 成员函数的实现

    与普通函数不同,类的成员函数名需要用类名来限制 Clock :: showTime()
  • 带默认形参值的成员函数



  • 内联成员函数

    内联函数的声明有两种:隐式声明和显式声明
    隐式声明:   直接将函数放在结构体里

    显式声明:采用关键字inline,在函数的返回值类型前添加inline

🙋‍♂️实例(时钟类): 



构造函数

构造函数的作用:在对象创建时利用特定的值构建对象,将对象初始化为一个特定的状态

 将其封装出去

主函数部分:   

   int main()
   {
        Clock c(0,0,0); // 声明变量并赋值
        c.showTime();
        c.setTime(3,29,20);

    }

 初始化赋值,hour在开空间的同时将h赋值,minute在开空间的同时传参m

🙋‍♂️实例(α+βi):

 #include <iostream>
#define P 3.1415926
#include "circle.h"
using namespace std;class Complex
{
public:Complex(double r = 0,double i =0);void setReal(double r);void setImage(double i);void show(){cout<<real<<"+"<<image<<"i"<<endl;}private:double real;double image;
};
void Complex::setReal(double r)
{real= r;
}
void Complex::setImage(double i)
{image = i;
}
Complex ::Complex(double r, double i):real(r),image(i)
{}
int main()
{Complex c(10,20);c.show();
}

复制构造函数



复制构造函数定义与声明:

class 类名

{

public :

            类名(形参表); //构造函数

            类名(类名 & 对象名);  //复制构造函数

             ......

};

类名 ::类名(类名 & 对象名);  //复制构造函数的实现

{

             函数体

}

 


复制结构函数的实现:

Point :: Point(Point &p)

{

       x = p.x;

       y = p.y;

       cout <<  " Calling the copy constructor " << endl;

}

示例:

using namespace std;
class Point
{
public:Point (int x1 = 0,int y1 = 0)//构造函数{x = x1;y = y1;}Point (Point &p);//复制构造函数int getX()//获取private中的数值{return x;}int getY(){return y;}
private:int x,y;
};
//成员函数的实现
Point ::Point(Point &p)
{x = p.x;y = p.y;cout<<"Calling the constructor"<<endl;
}
//形参为point类对象的函数
void fun1(Point p)
{cout <<p.getX()<<endl;
}
//返回值为point类对象的函数
Point fun2()
{Point a(1,2);return a;
}
//主函数
int main()
{Point a(4,5);//第一个对象Point b =a; //情况1 用a初始化b,第一次调用复制构造函数cout<<b.getX()<<endl;fun1(b);    //情况2 对象b作为fun1的实参 第二次调用复制构造函数b = fun2(); //情况3 函数的返回值是类对象,函数返回时,调用复制构造函数cout<<b.getX()<<endl;return 0;}


 ​​​​​​

析构函数

析构函数的特点:

#include <iostream>  class MyClass {  
public:  MyClass() {  std::cout << "Constructor called\n";  }  ~MyClass() {  std::cout << "Destructor called\n";  // 清理工作,比如释放资源  }  
};  int main() {  MyClass obj; // 调用构造函数  // 当obj的生命周期结束时(main函数返回时),调用析构函数  return 0;  
}
  • ~  没有返回类型,也不接受任何参数
  • 当一个对象的生命周期结束时,析构函数会自动被调用。这包括局部对象在离开其作用域时、动态分配的对象被delete删除时、全局对象在程序结束时、以及容器中的对象被销毁时等情况。
  • 如果没有定义析构函数编译器会自动默认生成,但如果定义了析构函数编辑器便不会生产
  • 析构函数不能被重载,每个类只能有一个析构函数
  • 析构函数通常被声明为public,因为即使你创建了类的对象,也需要外部代码(如delete表达式)来销毁对象并调用析构函数。但是,在特定情况下(如基类的析构函数在派生类中被隐藏时),可能会将析构函数声明为protectedprivate   

🙋‍♂️实例(坐标显示,圆环面积)

#include <iostream>
#define P 3.1415926
#include "circle.h"
using namespace std;
class Point
{
public:Point(int x = 0,int y = 0);Point(const Point &other);void setX(int x);void setY(int y);int getX(){return m_x;}int getY(){return m_y;}void show();~Point(){cout << "~"<< endl;}
private:int m_x,m_y;
};void Point ::show()
{cout << "(" << m_x << "," << m_y << ")" << endl;
}
Point ::Point(int x, int y):m_x(x),m_y(y)
{cout <<" p "<<endl;
}
Point ::Point(const Point &other):m_x(other.m_x),m_y(other.m_y)
{cout << "p1 " << endl;
}int main()
{Point p(10,20);p.show();Point p1(p);p1.show();return 0;
}

求圆环的面积:
 
 

#include <iostream>
#define P 3.1415926  //宏定义using namespace std;class Circle   //声明定义类Circle及其数据和方法
{
public:    //外部接口double area()       // 计算面积{return  radius * radius * P;}void setRaius(double r)  // 获取private的数据{radius = r;}
private:double radius;
};int main()
{Circle c1;Circle c2;c1.setRaius(20);c2.setRaius(10);cout <<c1.area() - c2.area() <<endl;cout << "Hello World!" << endl;return 0;
}

封装:

类的组合



Circle :: Circle (double r) : radius ( r ) { }

radius 开空间的同时将 r 赋值

 🙋‍♂️练习(线段长度):

Line 类包含p1 , p2作为其数据成员,Line类具有计算线段长度的功能


 

#include <iostream>using namespace std;
class Point    //point 类定义
{
public:Point(int x = 0,int y = 0);  //构造函数Point(const Point &other);   void setX(int x);void setY(int y);int getX(){return m_x;}int getY(){return m_y;}void show();~Point(){cout << "~Point"<< endl;}
private:int m_x,m_y;
};void Point ::show()
{cout << "(" << m_x << "," << m_y << ")" << endl;
}
Point ::Point(int x, int y):m_x(x),m_y(y)
{cout <<" p(int,int) "<<endl;
}
//复制构造函数的实现
Point ::Point(const Point &other):m_x(other.m_x),m_y(other.m_y)
{cout << "point &other " << endl;
}//类的组合
class Line //line类的定义
{
public:    //外部接口Line(int x1,int y1,int x2,int y2):m_p1(x1,y1),m_p2(x2,y2){cout << "line(int,int,int,int)" <<endl;}Line(const Point &p1,const Point &p2):m_p1(p1),m_p2(p2){cout<<"point &p"<<endl;}void show(){m_p1.show();cout<<"->";m_p2.show();cout<<endl;}~Line(){cout<<"~Line"<<endl;}
private:   Point m_p1,m_p2; //point类的对象m_p1,m_p2
};
int main()
{Point p1(3,4); Point p2(9,10);  //建立point类对象Line l(p1,p2);   //建立line类的对象l.show();return 0;
}

 UML(类图)


http://www.ppmy.cn/ops/93132.html

相关文章

电脑屏幕录制工具分享5款,附上详细电脑录屏教程(2024全新)

日月更迭&#xff0c;转眼间已经来到了2024年的立秋&#xff0c;在这个数字技术快速发展的时代&#xff0c;电脑录屏技术已经成为了一项不可或缺的技能&#xff0c;无论是用于工作汇报、在线教学、游戏直播还是个人娱乐。那么录屏软件哪个好用呢&#xff1f;接下来&#xff0c;…

solidity 数学和密码学函数

数学和密码学函数为开发者提供了一系列强大的工具&#xff0c;用于执行各种数学运算和加密操作 addmod(uint x, uint y, uint k) returns (uint) 计算 (x y) % k&#xff0c;加法会在任意精度下执行&#xff0c;并且加法的结果即使超过 2**256 也不会被截取。 从 0.5.0 版本…

【数据结构】排序 —— 归并排序(mergeSort)、计数排序、基数排序

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…

无人机之民用无人机用途分类篇

一、航拍无人机 用于航拍摄影和电影制作&#xff0c;提供空中视角的拍摄服务。可用于电影制作、广告拍摄、房地产销售等。 二、物流无人机 用于快递和货物运输&#xff0c;提高物流效率&#xff0c;可以到达传统配送方式难以覆盖的地区&#xff0c;在突发事件如自然灾害、疫…

ubuntu20.04安装部署nginx+php7.4+mysql8.0+redis

要在 Ubuntu 20.04 上安装 MySQL 8.0、PHP 7.4、Nginx 1.24 和 Redis&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 更新系统包列表 sudo apt update sudo apt upgrade -y2. 安装 Nginx 1.24 对于特定版本的 Nginx&#xff0c;您可能需要从官方源安装。但通常情况下&a…

Axios 怎么通过 FormData 对象上传文件

FormData 对象介绍 FormData 是一个用于在客户端创建表单数据的接口。它可以通过 JavaScript 中的 new FormData() 构造函数创建。FormData 可以将表单字段的键值对以键值对的方式添加&#xff0c;同时也支持添加文件。 在文件上传的场景中&#xff0c;我们可以使用 FormData …

Python 常用内置函数

目录 1、enumerate函数 1.1、for循环中使用 1.2、enumerate指定索引的起始值 1.3、enumerate在线程中的作用 2、Map 函数 2.1、map()函数可以传多个迭代器对象 3、lambda表达式&#xff08;匿名函数&#xff09; 示例 4、sort函数和sorted函数 4.1、sort()函数 4.2、…

有序数组的平方(LeetCode)

题目 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 解题 以下算法时间复杂度为 def sortedSquares(nums):n len(nums)result [0] * n # 创建一个结果数组&#xff0c;长度与 nums 相同le…