本节总结
介绍了复制构造函数的使用方法以及需要使用的情况
细节摘录
1. 复制情况下,操作过程是系统先创建一个临时对象(使用构造函数),然后再用复制构造函数复制到左边。
2. 如果要使用复制构造函数,那么构造函数就不能声明为explicit
3. 函数,容器,数组中都涉及到了复制函数机制。
4. 两种情况下一般要用到复制函数:1.有成员是指针 2. 复制时要做一些特定工作
5. 如果要禁止复制,只要将复制函数声明为private即可。
课后习题
1. 单个形参,且为本对象的引用,这样的【构造函数】就叫做复制构造函数。
2. 说明这种类型的构造函数被声明为explicit。
3. 第一句和最后一句那里都用了。
4.
5. a不用 b要 c 不用 d
6. 如果这样,则该函数
介绍了复制构造函数的使用方法以及需要使用的情况
细节摘录
1. 复制情况下,操作过程是系统先创建一个临时对象(使用构造函数),然后再用复制构造函数复制到左边。
2. 如果要使用复制构造函数,那么构造函数就不能声明为explicit
3. 函数,容器,数组中都涉及到了复制函数机制。
4. 两种情况下一般要用到复制函数:1.有成员是指针 2. 复制时要做一些特定工作
5. 如果要禁止复制,只要将复制函数声明为private即可。
课后习题
1. 单个形参,且为本对象的引用,这样的【构造函数】就叫做复制构造函数。
2. 说明这种类型的构造函数被声明为explicit。
3. 第一句和最后一句那里都用了。
4.
#include <iostream>
using namespace std;
class NoName {
public:
NoName() : pstring(new string), i(0), d(0) {};
NoName(int a) : pstring(new string), i(a), d(0) {};
NoName(NoName &N) {
i=N.i; /* 问题是:成员是私有的,为什么可以直接取用?*/
string *pstring=new string(*N.pstring);
d=N.d;
}
int GetI() {
return i;
}
double GetD() {
return d;
}
private:
string * pstring;
int i;
double d;
};
int main()
{
NoName a;
NoName b(1);
cout << a.GetI() << a.GetD() << endl;
cout << b.GetI() << b.GetD() << endl;
b=a;
cout << a.GetI() << a.GetD() << endl;
cout << b.GetI() << b.GetD() << endl;
return 0;
}
5. a不用 b要 c 不用 d
6. 如果这样,则该函数
该函数的参数我们使用了值传递的方式,按照前面的分析,这需要调用复制构造函数,于是编译器又再度搜寻,最后当然又找到了它,于是进行调用,但同样地,传参时又要进行复制,于是再调用...这个过程周而复始,每次都是到了函数入口处就进行递归,直到堆栈空间耗尽,程序崩溃...