构造函数是一种特殊的函数
主要用来在创建对象时初始化对象, 即为对象的成员变量附初始值.
也可以将对象在创建之初需要执行的逻辑写在构造函数中
// 例
class CA{
int a;
public:
void setA();
};// 此处没有构造函数
int main()
{
CA a; // 此时系统自动调用一个隐藏起来看不见的, 什么都不干的构造函数
}
// 这个隐藏的构造函数大概长这个样子-->
// CA(){}
拷贝构造是一种特殊的带参构造函数, 参数为同类型类对象, 用于同类型对象的初始化
int main()
{
int a = 10;
int b(a);
cout << b;
}
b的值和a相同, 但也出现问题(a中的成员s和b中的成员s指向同一个地址, 如果a.s改变b.s也会随之改变)
类名 (const 类名& 引用名 ) { }
浅拷贝(默认拷贝构造就是一种看不见的系统自动调用的浅拷贝)
MyStu::MyStu(const MyStu& other)
{
id = other.id;
name = other.name;
}
深拷贝: (可以解决默认拷贝构造两指针指向同一内存)
MyStu::MyStu(const MyStu& other) // 深拷贝
{
id = other.id;
if (other.name == nullptr)
name = nullptr;
else
{
int length = strlen(other.name);
name = new char[length + 1];
strcpy(name, other.name);
}
name = other.name;
}
int main()
{
MyStu m;
MyStu m1(m); //拷贝构造的显式调用
MyStu m2 = m; //拷贝构造的隐式调用
MyStu m3;
m3 = m; //重载赋值
return 0;
}
MyStu fun(MuStu s) {return s;}
// 发生两次拷贝构造调用
析构函数也是一种特殊的构造函数
主要功能是在对象声明周期结束时做一些清理工作
将对象生命周期最后要做的事情写在析构函数中
构造函数:
析构的调用时机:
class MyStu {
int id;
char* name;
public:
~MyStu(); // 析构函数
};
MyStu::~MyStu() // 析构(释放清理类对象的函数)
{
if (name)
delete[] name;
name = nullptr;
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有