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