您的位置:首页 > 编程语言 > C语言/C++

C++拷贝构造函数 调用时机 -- 深浅拷贝

2016-08-05 09:20 447 查看
http://blog.csdn.net/lwbeyond/article/details/6202256

拷贝函数调用时机

对象以值传递方式传入函数参数

对象以值传递方式从函数返回

对象需要通过另外一个对象进行初始化(注意与初始化后,=区别

例题1

class MyClass
{
public:
MyClass(int i = 0)
{
cout << i;
}
MyClass(const MyClass &x) // 拷贝构造函数
{
cout << 2;
}
MyClass &operator=(const MyClass &x)
{
cout << 3;
return *this;
}
~MyClass()
{
cout << 4;
}
};

int main( )
{
MyClass obj1(1), obj2(2); //
MyClass obj3 = obj1; //调用拷贝构造函数
// 最终程序输出 122444
return 0;
}


class MyClass
{
public:
MyClass(int i = 0)
{
cout << i;
}
MyClass(const MyClass &x) // 拷贝构造函数
{
cout << 2;
}
MyClass &operator=(const MyClass &x)
{
cout << 3;
return *this;
}
~MyClass()
{
cout << 4;
}
};

int main( )
{
MyClass obj1(1), obj2(2); //
MyClass obj3;
obj3 = obj1; //调用operator =
// 最终程序输出 1203444
return 0;
}


例题2



例子3

#include <iostream>
using namespace std;

int cnt = 1;

class A{
public:
int a;
A(){
cout << "A()"<< endl;
}
A(const A& u)   // 拷贝构造函数
{
cout << cnt++ << " " << "copy A()" << endl;
}
};

A f(A u)
{
A v(u);
A w = v;
cout << "before return" << endl;
return w;
}

int main()
{
A x;
cout << "begin" << endl;
A y = f(x);
cout << "end" << endl;
return 0;
}


程序运行后的结果如下:



#include <iostream>
using namespace std;

int cnt = 1;

class A{
public:
int a;
A(){
cout << "A()"<< endl;
}
A(const A& u)   // 拷贝构造函数
{
cout << cnt++ << " " << "copy A()" << endl;
}
};

A f(A u)
{
cout << "before f" << endl;
A v(u);
A w = v;
cout << "before return" << endl;
return w;
}

int main()
{
A x;
cout << "begin" << endl;
A y = f(f(x));
cout << "end" << endl;
return 0;
}


程序运行后的结果如下:



浅拷贝例题





sayHello退出的时候调用析构函数,delete p; 因为属于浅拷贝,所以参数中的b中的A * p与 main函数中的B b中的A * p 是一份内存。

函数自己退出时,调用析构函数 delete p;

main函数退出,调用析构函数 delete p;(重复delete,导致程序崩溃)

可以自定义拷贝构造函数,实现深拷贝

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: