类中的六个默认成员函数
默认成员函数为了解决C语言存在的一些问题而诞生,默认存在于类中,进行某种操作时会自动调用默认成员函数,如想在此种操作中自动实现某种操作,可以手动定义此默认成员函数,如果手动定义则取代默认成员函数。
一、构造函数
定义对象时会自动调用构造函数,用来进行对象的初始化,构造函数可以进行重载。
默认情况下:
- 默认构造函数对内置类型不进行初始化
- 对自定义类型,调用此自定义类型的构造函数
class A{ //语法格式
public:
A(参数类型1 参数名1,....) //函数名必须为类名
{
//默认情况下进行上面两种操作
//可自定义为任何想要的操作,一般为初始化类成员变量
}
}
定义时自动调用:
二、析构函数
对象在销毁时会自动调用析构函数,用来销毁此对象。析构函数不能进行重载。
默认情况下:
- 默认析构函数对内置类型直接进行回收
- 对自定义类型,调用此自定义类型的析构函数
需要注意如果类中存在动态内存开辟的成员,需要手动实现析构函数否则会存在内存泄漏。
class A{ //语法格式
public:
~A() 函数名必须为~加类名
{
//默认情况下进行上面两种操作
//可自定义为任何想要的操作,一般为释放在堆空间开辟的内存空间而自定义
}
}
对象在函数结束时自动销毁,所以函数结束时会自动对其进行调用:
三、拷贝构造函数
对象在进行拷贝操作时会自动调用拷贝构造函数,用来拷贝对象。(拷贝构造函数也是构造函数的重载,所以需要注意如果手动实现了拷贝构造函数就必须也手动实现构造函数,否则对象无法初始化)
默认情况下:
- 默认对内置类型直接进行浅拷贝
- 对自定义类型,调用此自定义类型的拷贝构造
如果类中存在指针或者动态内存开辟,则必须手动实现拷贝构造函数,否则会存在浅拷贝问题。
class A{ //语法格式
public:
A(A& 参数名 )
//函数名为类名,参数类型为类名,且必须用引用的方式,否则会存在无限拷贝问题
{
//默认情况下进行上面两种操作
//可自定义为任何想要的操作,一般为为解决浅拷贝实现
}
}
下面理解为通过拷贝a1的方式创建对象a2:
四、赋值重载函数
对象在进行赋值操作时会自动调用赋值重载函数,用来给对象进行赋值。
默认情况下:
- 默认对内置类型直接进行赋值
- 自定义类型成员变量需要调用对应类的赋值运算符 重载完成赋值
如果类中存在指针或者动态内存开辟,则必须手动实现赋值重载函数,否则也会存在浅拷贝问题。
- 拷贝构造函数和复制重载函数实现的内容很像却有本质不同,拷贝构造函数是用于对未初始化的存储区进行初始化,而赋值重载函数则是处理一个已经存在的对象。对一个对象赋值,当它一次出现时,它将调用拷贝构造函数,以后每次出现,都调用赋值重载函数。拷贝构造函数只能用在对象的初始化操作中,而赋值重载函数可以用在任何类型的赋值操作中。
class A{
public:
A& operator=(const A& a)
{
if (this != &A)
{
_x = a._x;
_y = a._y;
}
int _x;
int _y;
};
int main()
{
A a1;
A a2;
a2 = a1;
}
赋值运算符重载运用方式:
五、对普通对象取地址重载
此运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需 要重载,比如想让别人获取到指定的内容
默认存在形式
class A
{
public:
A* operator&()
{
return this ;
}
};
六、对const对象取地址重载
此运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需 要重载,比如想让别人获取到指定的内容
默认存在形式
class A
{
public:
const A* operator&()const
{
return this ;
}
};
✨本文收录于C++语法及练习
当你喜欢一篇文章时,点赞、收藏和关注是最好的支持方式。如果你喜欢我的文章,请不要吝啬你的支持,点赞👍、收藏⭐和关注都是对我最好的鼓励。感谢你们的支持!如有问题欢迎指正!