#include<iostream> using namespace std; class Copy { public:Copy() {cout<<"I LOVE YOU!!!"<<endl;} Copy(int ) {cout<<"YOU LOVE ME"<<endl;} ~Copy() {cout<<"释放"<<endl;} // Copy(Copy &s)---------------------------------------------------会出现错误 // { // cout<<"!!!!!!!!!!!!!"<<endl;} Copy(Copy &) {cout<<"???????????????????"<<endl;} private: }; int main() { Copy s; Copy s2; Copy s3=s2;-------------------------------------------------实际上是调用了拷贝构造函数给,用s2给s3赋值 }
输出结果:
I LOVE YOU!!! I LOVE YOU!!! ??????????????????? 释放 释放 释放
如果把main函数中的 Copy s3=s2;改为Copy s3;s3=s2,则不会调用拷贝函数,输出结果为:
I LOVE YOU!!! I LOVE YOU!!! I LOVE YOU!!! 释放 释放 释放
===========================================================================
#include<iostream> using namespace std; class Copy { public:Copy() {cout<<"I LOVE YOU!!!"<<endl;} Copy(int ) {cout<<"YOU LOVE ME"<<endl;} ~Copy() {cout<<"释放"<<endl;} // Copy(Copy &s) // { // cout<<"!!!!!!!!!!!!!"<<endl;} Copy(Copy &) {cout<<"???????????????????"<<endl;} void show()//---------------------------------------------在类中添加一个show函数 { cout<<"/////////////"<<endl;} private: }; void fun(Copy s4) //-------------------------------------------------添加一个fun函数 {s4.show();} int main() { Copy s; Copy s2; Copy s3=s2; fun(s); //--------------------------------------调用fun函数。并通过s进行赋值 }
得到结果如下:
I LOVE YOU!!! I LOVE YOU!!! ??????????????????? //调用了两次拷贝函数 ??????????????????? ///////////// 释放 释放 释放 释放=========================================================================
#include<iostream> using namespace std; class Copy { public:Copy() {cout<<"I LOVE YOU!!!"<<endl;} Copy(int ) {cout<<"YOU LOVE ME"<<endl;} ~Copy() {cout<<"释放"<<endl;} // Copy(Copy &s) // { // cout<<"!!!!!!!!!!!!!"<<endl;} Copy(const Copy &)-------------一定要加const(一般都加上),因为const可以引用const和普通对象,普通不能引用const; {cout<<"???????????????????"<<endl;} void show() { cout<<"/////////////"<<endl;} private: }; void fun(Copy s4) {s4.show();} Copy fun_2() { static Copy s4(5); return s4;} int main() { Copy s; Copy s2; Copy s3=s2; fun(s); Copy s5=fun_2(); }
结果为:
I LOVE YOU!!! I LOVE YOU!!! ??????????????????? ??????????????????? ///////////// 释放-------------------------------------------------------调用的fun函数,在fun函数结束时就释放 YOU LOVE ME ???????????????????---------------------去掉static则不会输出“??????????” 释放-------------------------------------------------s5=fun_2()释放两次; 释放 释放 释放 释放
==========================================================================
C++拷贝构造函数调用途径:
1、调用对象时用一个对象初始化另外一个对象;
2、传递一个对象到子函数中;
3、返回一个静态对象时。