作者 : 卿笃军
1)定义:拷贝构造函数,是一种特殊的构造函数。它由编译器调用来完毕一些基于同一类的其它对象的构建及初始化。
其唯一的形參必须是引用,但并不限制为const,一般普遍的会加上const限制。
此函数经经常使用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。假设能够的话,它将用常量方式调用,另外,也能够用很量方式调用。
2)调用拷贝构造函数的情形:
在C++中。以下三种对象须要调用拷贝构造函数(有时也称“复制构造函数”):
a) 一个对象作为函数參数,以值传递的方式传入函数体;
b) 一个对象作为函数返回值,以值传递的方式从函数返回;
c) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);
假设在前两种情况不使用拷贝构造函数的时候。就会导致一个指针指向已经被删除的内存空间。对于第三种情况来说,初始化和赋值的不同含义是拷贝构造函数调用的原因。其实,拷贝构造函数是由普通构造函数和赋值操作符共同实现的。描写叙述拷贝构造函数和赋值运算符的异同的參考资料有非常多。
通常的原则是:①对于凡是包括动态分配成员或包括指针成员的类都应该提供拷贝构造函数;②在提供拷贝构造函数的同一时候。还应该考虑重载"="赋值操作符号。原因详见后文。
拷贝构造函数必须以引用的形式传递(參数为引用值)。其原因例如以下:当一个对象以传递值的方式传一个函数的时候。拷贝构造函数自己主动的被调用来生成函数中的对象。假设一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才干够传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外。拷贝构造函数在对象被函数返回的时候也相同的被调用。
(以上文字段来自百度百科拷贝构造函数)
3)另外须要提一下的是explicit:
C++提供了keywordexplicit,能够阻止不应该同意的经过转换构造函数进行的隐式转换的发生。
声明为explicit的构造函数不能在隐式转换中使用。
#include <iostream> using namespace std; class A { public: A(int a){ m_a = a; } // explicit A(int a){ m_a = a; } //explicit:使构造函数不能对单个数字进行强制转换 private: int m_a; }; int main() { A a(3); A b = 6; //相当于A b = A(6),将6强制转换 return 0; }
注意:仅仅有单个的数字才干够A b = 6; 这样。可是不建议这么使用。
请依照上面的A a(3);方式使用。
演示样例:C++ 拷贝构造函数
#include <iostream> using namespace std; class Cpy { public: Cpy(int nA = 0, double douB = 0.0); //构造函数 Cpy(Cpy &p); //拷贝构造函数 private: int m_nA; double m_douB; }; //构造函数 Cpy::Cpy(int nA, double douB) { m_nA = nA; m_douB = douB; cout<<"Tip : Cpy::Cpy(int nA, double douB) ..."<<endl; } //拷贝构造函数 Cpy::Cpy(Cpy &p) { m_nA = p.m_nA; m_douB = p.m_douB; cout<<"Tip : Cpy::Cpy(Cpy &p) ..."<<endl; } //外部函数,返回值为一个类对象. Cpy fn() { cout<<"Tip : Cpy fn() ..."<<endl; Cpy buf; return buf; } int main() { Cpy a; //调用构造函数 Cpy b(a); //调用拷贝构造函数 Cpy c = a; //调用拷贝构造函数 fn(); //return时,调用拷贝构造函数 return 0; }执行结果:
參考文献:百度百科,拷贝构造函数。http://baike.baidu.com/view/1266959.htm,2014年5月24日
百度百科,explicit,http://baike.baidu.com/view/2422253.htm,2014年5月24日
熊思的CSDN博客,C++构造函数,http://blog.csdn.net/u010056396/article/details/26623069,2014年5月24日