C++ 赋值运算符和拷贝构造函数
拷贝构造函数
class Foo{
public:
Foo();
Foo(const Foo&); //自己定义的拷贝构造函数
};
如果不自己定义,编译器会自己合成一个默认拷贝构造函数:
class Foo{
public:
int a,b,c;
Foo();
Foo(const Foo&); //合成的拷贝构造函数
};
Foo::Foo(const Foo& f) : a(f.a), b(f.b), c(f.c) {}
拷贝构造函数总是用在初始化的时候,不要和赋值搞混。
string dots(10,'.');//构造函数初始化
string s(dots); //构造函数初始化
string s2 = dots; //拷贝构造函数初始化,不是赋值
string s3 = string(10, '.');//拷贝构造函数初始化
但在一下情况,也会隐式调用拷贝构造函数:
- 将对象作为实参传递。
- 返回一个对象(非引用)。
- 用花括号初始化数组中的元素或者一个聚合类的成员。
- 容器的push(), push_back()等就是拷贝初始化,而emplace_back()是直接初始化。
拷贝赋值运算符:“=”
class Foo{
public:
Foo();
Foo& operator=(const Foo&); //重载赋值运算符
};
如果不自己定义,编译器会自己合成一个默认拷贝赋值运算符:
class Foo{
public:
int a,b,c;
Foo();
Foo& operator=(const Foo&); //合成的拷贝构造函数
};
Foo& Foo::operator=(const Foo& f)
{
a = f.a;
b = f.b;
c = f.c;
return *this;
}
一般情况下,如果类需要自定义的析构函数,那么必定需要自定义赋值运算符和拷贝构造函数。
如果需要自定义赋值运算符(拷贝构造函数),那么必定需要自定义拷贝构造函数(赋值运算符),但不一定必须定义析构函数。
自定义赋值运算符要注意自赋值的情况
禁止拷贝、赋值
一些情况下类禁止拷贝,赋值,例如cin,cout。
class Foo
{
public:
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
}
链接一个以前写过的:
https://www.cnblogs.com/hellozhangjz/p/12347628.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix