C++拷贝构造函数和operator =的区别

C++拷贝构造函数和operator =的区别

起因

之前感觉拷贝构造函数和operator =作用很相似,也没有细察他们的区别,今天看了一些文章实验了一下:

比如我创造了一个Base的class,我同时编写了拷贝构造函数和operator=,那么对于下面这个代码有几个疑问:

1
2
Base a;
Base b = a;

Base b = a; 调用拷贝构造函数 还是 operator =呢? 是两者都可以,还是必须是其中一种?

解析

首先我们了解他们的调用时机:

  • 构造函数调用时机:该类对象初始化

  • operator= 调用时机:该类对象被赋值 =

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

class Base
{
public:
Base()
{
cout<<"constructor"<<std::endl;
}

Base(const Base &copy)
{
cout<<"copy constructor"<<endl;
}

const Base &operator=(Base &copy)
{
cout<<"operator="<<endl;
return *this;
}

};

int main()
{

Base a; // 该类对象初始化,constructor
Base b = a; // 该类对象初始化,copy constructor,并且只能用copy constructor,不能用operator =
// 因为删除拷贝构造函数(Base(const Base &copy) = delete;)后
// 提示了 error: use of deleted function 'Base::Base(const Base&)'


Base d; // 该类对象初始化,constructor
d = a; // 该类对象被赋值,operator= ,并且只能用operator=

return 0;
}

个人认为这样的设计十分合理,从调用时机很好的区分了两者的区别。

Reference

https://www.cnblogs.com/yiii/p/5328889.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!