[C++] 拷贝构造函数的调用
2009-10-28 11:42
288 查看
晚上做C++作业,碰到一个拷贝函数的问题,看了会书也没太看明白,回到寝室马上试验了下才差不多弄清楚了拷贝构造函数及临时对象的调用。拷贝构造函数主要在以下三种情况下起初始化作用:
1. 在声明语句中用一个对象初始化另一个对象;
2. 将一个对象作为参数按值调用方式传递给另一个对象时生成对象副本;
3. 生成一个临时对象作为函数的返回结果。
那么接着就看一下在这三种情况下拷贝构造函数分别在什么时候调用,以及如果有临时对象的话,在什么时候析构。先假定有一个类FOO,在构造函数中会输出“Constructing.”,在拷贝构造函数中会输出“Copy constructing.”,在析构函数中会输出“Destructing.”。输出结果中的注释是说明之用。
在声明语句中用一个对象初始化另一个对象
在声明语句中用一个对象初始化另一个对象时,不存在临时对象的问题,新的对象直接调用拷贝构造函数,进行对象的初始化,也没有什么调用顺序的问题了,例如:
程序代码:[ 复制代码到剪贴板 ]
FOO obj1;
FOO obj2=obj1;
如果类FOO有拷贝构造函数,那么在定义时就会调用拷贝构造函数,在对象的生存周期结束时,调用对象的析构函数。上面这段程序的输出结果就是:
程序代码:[ 复制代码到剪贴板 ]
Constructing. // constructing obj1
Copy constructing. // constructing obj2
Destructing. // destructing obj2
Destructing. // destructing obj2
将一个对象作为参数按值调用方式传递给另一个对象时生成对象副本
将对象按值调用作为函数的参数时,在函数的开始将生成一个临时对象,如果对象有拷贝构造函数,就使用拷贝构造函数对临时对象进行初始化,然后在函数结事调用临时对象的析构函数,例如:
程序代码:[ 复制代码到剪贴板 ]
void get_object(pobj) {
FOO obj;
return;
}
在上面这段代码中,先执行的是参数pobj的初始化,然后再进行局部对象变量obj的初始化。以上代码输出结果如下:
程序代码:[ 复制代码到剪贴板 ]
Copy constructing. // copy constructing pobj
Constructing. // constructing obj
Destructing. // destructing obj
Destructing. // destructing pobj
生成一个临时对象作为函数的返回结果
生成一个临时对象作为函数的返回结果时,如果返回结果有拷贝构造函数就会调用返回结果的拷贝构造函数进行初始化,而且是在return语句执行时进行,并且在return完成时调用析构函数,例如:
程序代码:[ 复制代码到剪贴板 ]
FOO get_object() {
FOO obj;
return obj;
}
FOO myobj;
myobj=get_object();
在函数get_object()内部,先进行obj的初始化,在执行到return语句时,创建一个临时对象,调用拷贝构造函数用obj作为参数对临时对象进行初始化,而之后则是先进行函数内部对象变量的析构,再进行临时变量的析构,因为临时变量要在函数外部对可能接收返回值的变量进行赋值。以上代码的输出结果如下:
程序代码:[ 复制代码到剪贴板 ]
Constructing. // constructing myobj
Constructing. // constructing obj
Copy constructing. // copy constructing temp obj
Destructing. // destructing obj
Destructing. // destructing temp obj
Destructing. // destructing myobj
就这样,在VC调试了3个例子就可以差不多弄清拷贝构造函数的调用时间了。
1. 在声明语句中用一个对象初始化另一个对象;
2. 将一个对象作为参数按值调用方式传递给另一个对象时生成对象副本;
3. 生成一个临时对象作为函数的返回结果。
那么接着就看一下在这三种情况下拷贝构造函数分别在什么时候调用,以及如果有临时对象的话,在什么时候析构。先假定有一个类FOO,在构造函数中会输出“Constructing.”,在拷贝构造函数中会输出“Copy constructing.”,在析构函数中会输出“Destructing.”。输出结果中的注释是说明之用。
在声明语句中用一个对象初始化另一个对象
在声明语句中用一个对象初始化另一个对象时,不存在临时对象的问题,新的对象直接调用拷贝构造函数,进行对象的初始化,也没有什么调用顺序的问题了,例如:
程序代码:[ 复制代码到剪贴板 ]
FOO obj1;
FOO obj2=obj1;
如果类FOO有拷贝构造函数,那么在定义时就会调用拷贝构造函数,在对象的生存周期结束时,调用对象的析构函数。上面这段程序的输出结果就是:
程序代码:[ 复制代码到剪贴板 ]
Constructing. // constructing obj1
Copy constructing. // constructing obj2
Destructing. // destructing obj2
Destructing. // destructing obj2
将一个对象作为参数按值调用方式传递给另一个对象时生成对象副本
将对象按值调用作为函数的参数时,在函数的开始将生成一个临时对象,如果对象有拷贝构造函数,就使用拷贝构造函数对临时对象进行初始化,然后在函数结事调用临时对象的析构函数,例如:
程序代码:[ 复制代码到剪贴板 ]
void get_object(pobj) {
FOO obj;
return;
}
在上面这段代码中,先执行的是参数pobj的初始化,然后再进行局部对象变量obj的初始化。以上代码输出结果如下:
程序代码:[ 复制代码到剪贴板 ]
Copy constructing. // copy constructing pobj
Constructing. // constructing obj
Destructing. // destructing obj
Destructing. // destructing pobj
生成一个临时对象作为函数的返回结果
生成一个临时对象作为函数的返回结果时,如果返回结果有拷贝构造函数就会调用返回结果的拷贝构造函数进行初始化,而且是在return语句执行时进行,并且在return完成时调用析构函数,例如:
程序代码:[ 复制代码到剪贴板 ]
FOO get_object() {
FOO obj;
return obj;
}
FOO myobj;
myobj=get_object();
在函数get_object()内部,先进行obj的初始化,在执行到return语句时,创建一个临时对象,调用拷贝构造函数用obj作为参数对临时对象进行初始化,而之后则是先进行函数内部对象变量的析构,再进行临时变量的析构,因为临时变量要在函数外部对可能接收返回值的变量进行赋值。以上代码的输出结果如下:
程序代码:[ 复制代码到剪贴板 ]
Constructing. // constructing myobj
Constructing. // constructing obj
Copy constructing. // copy constructing temp obj
Destructing. // destructing obj
Destructing. // destructing temp obj
Destructing. // destructing myobj
就这样,在VC调试了3个例子就可以差不多弄清拷贝构造函数的调用时间了。
相关文章推荐
- C++中拷贝构造函数的调用与C++返回值优化
- C++之拷贝构造函数的调用时机
- C++的拷贝构造函数的四种调用
- [互联网面试笔试汇总C/C++-22] 拷贝构造函数调用的时机-完美世界
- 1、C++关于拷贝构造函数和赋值运算符重载问题的测试程序。因为调用顺序不清,导致内存泄漏new delete
- c++ 拷贝构造函数调用时机
- C++愤恨者札记4——拷贝构造函数被调用的四种情形
- C++ 中拷贝构造函数被调用情况
- c++怎样让返回对象的函数不调用拷贝构造函数
- C++拷贝构造函数的调用时机,如没有重载等号操作符,需重写使用深拷贝
- C++学习笔记-----在重载的赋值运算函数中调用拷贝构造函数
- C++拷贝构造函数 调用时机 -- 深浅拷贝
- C++关于析构函数和拷贝构造函数何时调用两个例子的理解
- c++拷贝构造函数的调用时机
- 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
- 关于C++组合理解以及拷贝构造函数的调用时间的理解
- 【C++】String拷贝(包含深拷贝浅拷贝)以及拷贝构造函数中几种调用的情况
- C++:拷贝构造函数在什么时候被调用?
- C++ 拷贝构造函数和重载赋值操作符相互调用分析 [转]
- C++拷贝构造函数被调用的三种情况