一、构造方法
构造方法的名字必须与类名同名
它不具有任何返回值,也不能声明返回值类型,连void都不能写
构造方法可以重载
构造方法声明一般格式为
类名(<形参列表>);
定义构造方法格式为
类名::类名(<形参列表>){.......}
构造方法中的this指向新创建的对象.
构造方法的功能是由用户定义的,用户根据初始化的要求设计方法体和方法参数。一般功能都是用于初始化实例成员变量, 有两种方式
(1)this->实例成员变量=值
(2)参数初始化表
构造方法的调用: 当通过一个类创建对象后,会自动触发执行类的一个构造方法。如果类中构造方法重载时,系统根据创建对象时传递的实参来调用类中的其中一个构造方法。(只有创建对象时,才会触发执行构造方法)
默认构造方法:如果在类中没有定义构造方法,则C++系统会自动生成一个构造方法,只是这个构造方法的方法体是空的,也没有参数。(公共、无参、空实现) 例:public:类名() { }
如果自定义了任意构造方法,则默认构造方法不会被自动加入。
创建对象的一般格式为
类名 对象名; //触发调用无参构造方法
类名 对象名(实参1,实参2,…);//触发调用有参构造方法
二、拷贝构造函数
概念:拷贝构造方法是一种特殊的构造方法,用于从同一类的其他对象进行初始化。它通常用于复制一个对象的内容到另一个对象,以实现对象的拷贝操作。
拷贝构造方法的声明: 类名(const 类名& obj)
对象克隆简单示例:
Stu stu2(stu1)。这会触发复制构造方法
默认拷贝构造方法,如果没有写拷贝构造方法,则会有一个默认的拷贝构造方法,其函数体功能是通过已有对象引用,为新创建对象中的实例成员赋值,这属于浅拷贝。
默认拷贝构造方法:(浅拷贝)
一但显示创建拷贝构造方法,则默认拷贝构造方法就不会产生。
(
只要显示写了任何构造方法,默认无参构造方法都不会被自动加入。
而只有显示写了拷贝构造方法,默认拷贝构造方法才不会被自动加入。
)
浅拷贝,即使实例成员是指针,也只拷贝指针的值,这新的对象和源对象中的指针实例成员变量会指向同一个内存。
深拷贝,新的对象和源对象中的指针实例成员变量不会指向同一个内存。这就要求自定义拷贝构造方法。
三、对象的赋值(类似于浅拷贝,但不是浅拷贝)
格式: 对象1= 对象2,
意义:参与赋值运算的两个对象都是已经创建了的,作用是把对象2中成员变量的值赋值给对象1
注意:对象的赋值不会调用拷贝构造方法
t2.operator=(t1);简写为t2=t1。
//等号运算符重载。重写了等号运算符,若不重写,也会被编译器自动加上。
类对象默认加载的函数
构造函数
拷贝构造函数
析构函数
“=“运算符重载函数
四、析构函数
析构函数(destructor)名字是类名的前面加一个“~”符号。没有参数,并且也不能重载,没有返回值,连void 都不能写。
当对象的生命期结束时,会自动触发执行析构函数。
析构函数一般用于完成“清理”的工作。如果用户没有定义析构函数,C++编译系统会自动生成一个析构函数,但它什么操作都不进行。想让析构函数完成任何工作,都必须自定义的析构函数。
将析构函数声明前面加上virtual关键字的作用是实现多态的析构函数
五、常成员变量
1、常成员变量是用关键字const来声明成员变量, const位于类型前后都一样,但是成员类型为指针时,const只能位于类型后,如 int * const p;
2、常成员变量只能通过构造方法的初始化表对常成员变量进行初始化。
3、常成员变量所在类中所有构造方法都必须通过初始化表对常成员变量进行初始化。
4、常成员变量可以像普通的成员变量一样被访问,但是其值不能被修改.
六、常成员函数
1、常成员函数不能修改对象,即不能修改对象的成员变量
2、常成员函数:用const来修饰的成员函数,const位于函数的括号之后, 定义和声明的地方都要加上const。
3、常成员函数不能修改成员变量的值
4、常成员函数只能调用常成员函数,不能调用普通成员函数
5、普通成员函数可以调用常成员函数
七、常对象
定义常对象格式为: 类名 const对象名[(实参表列)]; 或const类名 对象名[(实参表列)];
常对象中所有的成员变量的值都不能被修改, 常对象只能访问常成员函数;
创建常对象时,触发的构造方法必须把所有的成员变量初始化,方式可以是初始化表也可以是函数体中的this。
八、在堆中创建对象
new运算符可以动态创建对象,创建对象后会返回对象的地址。如果内存不足导至无法成功创建对象,则会返回一个0指针值。
动态创建的对象要用“delete 对象指针”才能销毁对象; 销毁对象时,会触发析构函数的执行。
堆中对象起名字
销毁对象方法:
函数返回堆中对象的引用
九、static成员
1、如果想在同类的多个对象之间实现数据共享,可以用静态成员变量,即用static修饰的成员变量,例 static int a;
2、静态成员变量在项目刚运行的时候就分配内存,项目运行结束以后才销毁。
3、静态成员变量被它所属类创建的所有对象共享。
4、静态成员变量必须在类体外初始化, 一般使用对应的cpp文件中进行初始化。
格式为:类型 类名∷静态成员变量 = 初值
例: int Stu:: a = 20;
5、访问静态成员变量有两种方式:
与普通的成员变量一样
用静态成员变量所属类的类名来访问,即“类名::静态成员变量名”。第一种形式 底层也会变成"类名::静态成员变量名"
6、访问静态成员方法与访问静态成员变量相同。
7、在声明成员函数时,在最前面使用static修饰函数,该函数就是静态成员函数,静 态成员函数被访问与静态成员变量相同。静态成员函数中无this。
实例成员只能使用this访问。(实例成员:无static修饰的成员变量或成员方法)。