复制构造函数需要为对象的引用,而不能是对象的一个副本。比如可以 sample(const sample &ob); 但不能 sample(const sample ob); 其原因是,复制构造函数会在对象作为函数参数时被调用,这样一来像 sample(const sample ob); 这样的调用会无穷次递归调用。实际上,在程序中写成 sample(const sample ob); 如此形式,编译器也会报错。
一般情况下,复制构造函数的参数会写成 onst sample &ob 这样的形式,前面有 const 限定,所以不能在函数中修改引用对象的值,同时也不能使用对象的成员函数,即使这个成员函数并不会修改引用对象中成员变量的值,因为编译器会早早防止这种可能发生的情况。如:
[C++] 纯文本查看 复制代码
sample(const sample &ob)
{
a = ob.a;
b = ob.b;
ob.show();
}
编译器此时会报错:“sample::show”: 不能将“this”指针从“const sample”转换为“sample &”
如果不使用 const 限定符,那么引用对象可以自由的改变成员变量以及使用成员函数。注意此时的对象引用访问私有成员变量的形式,可以直接 ob.a 这种访问。但是当对象的引用并不是作为函数参数传递进来的话,那么这样访问是会被编译器报错的,如再 main() 中声明:
[C++] 纯文本查看 复制代码
sample &a = b;
a.show(); //通过成员函数可以访问私有成员变量
cout << a.a << " " << a.b << endl; //错误,不能直接访问私有成员变量,区别于对象引用作为函数参数(复制构造函数)的情况
|