拷贝构造函数及其参数类型
来源:互联网 发布:厦门网络推广 编辑:程序博客网 时间:2024/05/19 12:25
拷贝构造函数的参数类型必须是引用,而且通常情况下还是const的,但是const并不是严格必须的。
#include<iostream>
#include<string>
usingnamespace std;
class CClass
{
public:
CClass() : a(1), b("Hello, world.")
{
}
// 拷贝构造函数,参数中的const不是严格必须的,但引用符号是必须的
CClass(const CClass& c_class)
{
a = c_class.a;
b = c_class.b;
}
void setValues(int a, string b)
{
this->a = a;
this->b = b;
}
void printValues()
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
private:
int a;
string b;
};
int main(void)
{
CClass c;
c.setValues(100, "Hello, boys!");
CClass d(c); //此处调用拷贝构造函数
d.printValues();
return 0;
}
如果将拷贝构造函数中的引用符号去掉&,编译将无法通过,出错的信息如下:
…
非法的复制构造函数:第一个参数不应是“CClass”
…
没有可用的复制构造函数或复制构造函数声明为“explicit”
…
原因:
如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数。因此拷贝构造函数的参数必须是一个引用。
需要澄清的是,传指针其实也是传值,如果上面的拷贝构造函数写成CClass(const CClass* c_class),也是不行的。事实上,只有传引用不是传值外,其他所有的传递方式都是传值。
附带说明,在下面几种情况下会调用拷贝构造函数:
a. 显式或隐式地用同类型的一个对象来初始化另外一个对象。如上例中,用对象c初始化d;
b. 作为实参(argument)传递给一个函数。如CClass(const CClass c_class)中,就会调用CClass的拷贝构造函数;
c. 在函数体内返回一个对象时,也会调用返回值类型的拷贝构造函数;
d. 初始化序列容器中的元素时。比如 vector<string> svec(5),string的缺省构造函数和拷贝构造函数都会被调用;
e. 用列表的方式初始化数组元素时。string a[] = {string(“hello”), string(“world”)};会调用string的拷贝构造函数。
如果在没有显式声明构造函数的情况下,编译器都会为一个类合成一个缺省的构造函数。如果在一个类中声明了一个构造函数,那么就会阻止编译器为该类合成缺省的构造函数。和构造函数不同的是,即便定义了其他构造函数(但没有定义拷贝构造函数),编译器总是会为我们合成一个拷贝构造函数。
如果想阻止拷贝构造函数发生作用,那么一个类,必须显式声明其拷贝构造函数,并且将其设为private,并且其实现体是空的。因为仅仅是private的话,友元函数或者友元类还是有机会调用到这个拷贝构造函数。
通常情况下,如果一个类实现了拷贝构造函数,那么这个类也需要实现缺省构造函数。
- 拷贝构造函数及其参数类型
- 拷贝构造函数及其参数类型
- 拷贝构造函数及其参数类型
- 拷贝构造函数及其参数类型
- 拷贝构造函数及其参数类型
- C++拷贝构造函数 参数类型为什么是引用类型 ...
- 拷贝构造函数的参数为什么必须使用引用类型
- 拷贝构造函数的参数为什么必须使用引用类型.
- 拷贝构造函数的参数类型必须是引用
- 拷贝构造函数的参数为什么必须使用引用类型
- 拷贝构造函数的参数为什么必须使用引用类型
- 拷贝构造函数的参数为什么必须使用引用类型
- 拷贝构造函数的参数类型必须是引用
- 拷贝构造函数的参数为什么必须使用引用类型
- 拷贝构造函数的参数类型必须是引用
- 拷贝构造函数的参数类型必须是引用
- 拷贝构造函数的参数类型必须是引用
- 拷贝构造函数的参数为什么必须使用引用类型
- TabHost的使用方法
- Java定时器Quartz初体验
- VS2010 Code Snippets Manager
- Win7下安装Oracle 10g常见错误解决
- CHM帮助文件打开乱码解决方案
- 拷贝构造函数及其参数类型
- 用JS完成复选框checkbox的全选\反选\删除确认
- 一、选择公司的形式:
- Flash学习一
- 数字黑洞问题
- 利用半透明对话框实现新浪微博android客户端首次运行时的提示界面
- http://blog.csdn.net/thy822/article/details/5096664
- DOS下关机代码
- java程序中取得本机MAC地址