1.构造函数(为了初始化)
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
其特征如下:
(1)函数名和类名相同
(2)参数可有可无,无返回值
(3)对象实例化时,编译器自动调用对应的构造函数
(4)构造函数可以重载----一个类可以有多个构造函数
编译生成默认构造的特点:
1.自己写了就不会生成构造函数,自己不写才会生成默认构造
2.内置类型(基本数据类型 指针也是)的成员不会处理
3.自定义类型的成员才会处理,回去调用这个成员的默认构造函数
值得注意:
在类中写无参构造函数、全缺省的构造函数,也称为默认构造函数,但编译器只能调用一个默认构造函数,当我们既写无参又写全缺省多个并存时,会造成调用二义性,编译器会报错,产生冲突。
--------------------------------------------------------------------------------------------------------------------
2.析构函数(为了清理)
析构函数是特殊的成员函数,与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
其特征如下:
(1)析构函数名是在类名前面加上字符~。
(2)无参数,无返回值
(3)对象生命周期结束时,c++编译器自动调用析构函数
(4)一个类只能有一个析构函数(若没有显示定义,系统会自动生成默认的析构函数),也就是说析构函数不能重载。
值得注意:
后定义的对象先析构
---------------------------------------------------------------------------------------------------------------------
3.拷贝构造函数
其特征如下:
(1)拷贝构造函数是构造函数的一个重载形式
(2)拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。
(3)我们不写,编译器默认生成的拷贝构造,跟之前的构造函数不一样
内置类型,值拷贝;自定义类型,调用它的拷贝构造
值得注意:
拷贝构造一般要在前面加const
------------------------------------------------------------------------------------------------------------------------
4.赋值运算符重载
C++为了增加代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数。
函数名字:关键字 oprator后面接需要重载的运算符符号
函数原型:返回值类型 oprator操作符(参数列表)
注意
(1)不能通过连接其他符号来创建新的操作符
(不呢重载的运算符 “::” ,“sizeof”,“?:”,“.*” )
(2)重载操作符必须有一个自定义类型
(3)用于内置类型的运算符,含义不变
(4)5个以上运算符不可重载
(5) 内置类型,值拷贝;自定义类型,调用它的拷贝构造
-----------------------------------------------------------------------------------------------------------------------------
5.const成员函数
将const
修饰的“成员函数”称之为const
成员函数(注意这里不是说const
修饰返回值类型),const
修饰类成员函数,实际修饰该成员函数隐含的this
指针,表明在该成员函数中不能对类的任何成员进行修改。
(1)当一个对象被声明为const
(即常量对象),它不能调用非const
成员函数。
原因:这是因为常量对象不允许修改其内部状态,而非const
成员函数可能会修改对象的状态。在调用非const
成员函数时,实际上是通过一个隐含的指向对象的指针(即this
指针)来访问对象的成员。而常量对象的this
指针是指向常量的指针,因此无法传递给非const
修饰的成员函数,从而阻止了对常量对象进行状态修改的行为。简而言之,这是一种保护机制,确保常量对象的状态不会被意外修改。
(2)非const
对象可以调用const
成员函数,非const
对象可以传参给const
修饰的指针,权限的缩小是被允许的。
-----------------------------------------------------------------------------------------------------------------------------
6.取地址及const取地址操作符重载
class date
{
public: date* operator&()
{
return this;
}
const date* operator&() const
{
return this;
}
private:
int _year;
int _month;
int _day;
};
(1)非const
版本的operator&
函数返回一个指向当前对象的指针,允许对非const
对象使用取地址操作符。
(2)const
版本的operator&
函数也返回一个指向当前对象的指针,但是标记为const
,因此它只能用于const
对象。
这种重载是为了让对象在不同的上下文中能够正确地使用取地址操作符,并且符合const
语义。这种操作符重载通常不需要手动定义,因为编译器会自动生成默认的操作符重载函数,除非需要进行特定的定制。