C++ 拷贝构造函数和重载赋值操作符不能相互调用
来源:互联网 发布:mac 显示隐藏的文件夹 编辑:程序博客网 时间:2024/06/05 10:48
拷贝构造函数调用重载赋值操作符,重载赋值操作符调用拷贝构造函数的写法都是没有意义的。
首先:
拷贝构造函数的存在意义--------是通过已有的对象构造新的对象,构造完毕后才有两个对象;
重载赋值操作符的意义-----------将一个对象的值赋给另一个对象,两个对象都已经构造完毕了。
拷贝构造函数----调用-----重载赋值操作符:把已有对象的值赋给一个构造中的对象,虽然这个对象的内存已经分配好了
但是有可能导致循环调用重载赋值操作符和拷贝构造函数
重载赋值操作符---调用------拷贝构造函数:把已有对象复制并赋值给这个对象。
导致循环调用重载赋值操作符。
总之--复制构造函数调用赋值操作符就好像正在构造的对象却用已经构造好的对象;
赋值操作符调用复制构造函数就好像用正在构造的对象进行赋值;
例子:
例子1:拷贝构造函数调用重载赋值操作符(导致循环调用重载赋值操作符和拷贝构造函数 )
- #include <iostream>
- using namespace std;
- class Base {
- public:
- Base() {cout << "Constructor invoked!" << endl;}
- ~Base() {cout << "Destructor invoked!" << endl;}
- Base(const Base& rhs) {
- cout << "Copy constructor invoked!" << endl;
- operator=(rhs); // *this = rhs;
- }
- Base operator=(const Base& rhs) { // 问题出在这里,返回值不是引用会调用拷贝构造函数
- cout << "Copy assignment operator invoked!" << endl;
- return *this;
- }
- };
- int main(int argc, char** argv) {
- cout << "Hello World C++!" << endl;
- Base a;
- Base b(a); // Base b = Base(a);
- return 0;
- }
- #include <iostream>
- using namespace std;
- class Base {
- public:
- Base() {cout << "Constructor invoked!" << endl;}
- ~Base() {cout << "Destructor invoked!" << endl;}
- Base(const Base& rhs) {
- cout << "Copy constructor invoked!" << endl;
- operator=(rhs); // *this = rhs;
- }
- Base& operator=(const Base& rhs) { // 返回引用,可以接受
- cout << "Copy assignment operator invoked!" << endl;
- return *this;
- }
- };
- int main(int argc, char** argv) {
- cout << "Hello World C++!" << endl;
- Base a;
- Base b(a); // Base b = Base(a);
- return 0;
- }
这样做没有任何问题,但是破坏了拷贝构造函数的意义(不同人,可能理解不同),所以不推荐。
例子2:重载赋值操作符调用拷贝构造函数(导致循环调用重载赋值操作符 )
- #include <iostream>
- using namespace std;
- class Base {
- public:
- Base() {cout << "Constructor invoked!" << endl;}
- ~Base() {cout << "Destructor invoked!" << endl;}
- Base(const Base& rhs) {
- cout << "Copy constructor invoked!" << endl;
- }
- Base& operator=(const Base& rhs) {
- cout << "Copy assignment operator invoked!" << endl;
- *this = Base(rhs);
- return *this;
- }
- };
- int main(int argc, char** argv) {
- cout << "Hello World C++!" << endl;
- Base a;
- Base b(a); // Base b = Base(a);
- b = a;
- return 0;
- }
- class A;
- A a;
- A b=a; //拷贝构造函数调用
- //或
- A b(a); //拷贝构造函数调用
-
- A a;
- A b;
- b =a; //赋值运算符调用
你只需要记住,在C++语言里如下两种形式---均调用拷贝 构造函数
- String s2(s1);
- String s3 = s1;
1
2
3
4
5
6
7
8
9
10
11
12
13
class
String
{
public
:
String();
//默认构造函数;
String(
const
String& rhs);
//复制构造函数;
String& operater=(
const
String& rhs);
//赋值操作符;
...
private
:
char
*data;
};
String s1;
//调用默认构造函数;
String s2(s1);
//调用复制构造函数;
String s3=s1;
//调用复制构造函数
0 0
- C++ 拷贝构造函数和重载赋值操作符不能相互调用
- C++ 拷贝构造函数和重载赋值操作符相互调用分析
- 拷贝构造函数和重载"="赋值操作符
- c++拷贝构造函数和赋值操作符重载
- 关于拷贝构造函数和重载赋值操作符
- 拷贝构造函数 和 赋值操作符重载
- [C++]拷贝构造函数和赋值运算符重载
- c/c++ 构造函数、拷贝构造函数、析构函数和赋值运算符重载
- 拷贝构造函数中是否可以调用重载后的赋值运算操作符
- 拷贝构造函数和赋值操作符
- 赋值操作符和拷贝构造函数
- 赋值操作符和拷贝构造函数
- 拷贝构造函数和赋值操作符
- 赋值操作符和拷贝构造函数
- 赋值操作符和拷贝构造函数
- 赋值操作符和拷贝构造函数
- 拷贝构造函数和赋值操作符
- 赋值操作符和拷贝构造函数
- mysql区分大小写配置lower_case_table_names
- [转]结构体边界对齐问题
- C中方法的返回值可以是多个(Android之JNI)
- XML和JSON
- Linux系统下开发或者运行java程序
- C++ 拷贝构造函数和重载赋值操作符不能相互调用
- mysql的逆袭:如何做递归层次查询
- Nginx与PHP(FastCGI)的安装、配置与优化
- 支持多平台的2D和3D游戏引擎Godot开源
- Weighttp 学习 使用 安装
- rtmp服务器解决方案
- 编译及安装QCA类库及使用
- Android SDK 更新问题解决方法
- ios7版 30天精通iPhone手机编程 第24天 璀璨的烟花