35.}
36.
37.int main()
38.{
39. CExample test
(1);
40. //g_Fun(test); 按值传递将出错
41.
42. return 0;
43.}
四.拷贝构造函数的几个细节
1.拷贝构造函数里能调用private成员变量吗?
解答:
这个问题是在网上见的,当时一下子有点晕。
其时从名子我们就知道拷贝构造函数其时就是一个特殊的构造函数,操作的还是自己类的成员变量,所以不受private的限制。
2.以下函数哪个是拷贝构造函数,为什么?
[c-sharp]viewplaincopyprint?
1.X:
:
X(const X&);
2.X:
:
X(X);
3.X:
:
X(X&, int a=1);
4.X:
:
X(X&, int a=1, int b=2);
解答:
对于一个类X,如果一个构造函数的第一个参数是下列之一:
a)X&
b)constX&
c)volatileX&
d)constvolatileX&
且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数.
[c-sharp]viewplaincopyprint?
1.X:
:
X(const X&); //是拷贝构造函数
2.X:
:
X(X&, int=1); //是拷贝构造函数
3.X:
:
X(X&, int a=1, int b=2); //当然也是拷贝构造函数
3.一个类中可以存在多于一个的拷贝构造函数吗?
解答:
类中可以存在超过一个拷贝构造函数。
[c-sharp]viewplaincopyprint?
1.class X {
2.public:
3. X(const X&); // const 的拷贝构造
4. X(X&); // 非const的拷贝构造
5.};
注意,如果一个类中只存在一个参数为X&的拷贝构造函数,那么就不能使用constX或volatileX的对象实行拷贝初始化.
[c-sharp]viewplaincopyprint?
1.class X {
2.public:
3. X();
4. X(X&);
5.};
6.
7.const X cx;
8.X x = cx; // error
如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数。
这个默认的参数可能为X:
:
X(constX&)或X:
:
X(X&),由编译器根据上下文决定选择哪一个。