C++ primer
复制构造函数:
只有单个形参,而且该形参是对本类类型对象的引用(常为const修饰,只读),这样的构造函数称为 复制构造函数。与默认的构造函数一样,复制构造函数可由编译器隐式调用。
复制构造函数用于:
1、根据另一个同类型的对象显式 或 隐式 初始化一个对象;
2、复制一个对象,将它作为实参传递给一个函数;
3、从函数返回时复制一个对象
4、初始化顺序容器中的元素;
5、根据元素初始化式列表初始化数组元素;
构造函数隐式转换问题:
隐式转换是由 成员变量类型 转换为 类类型,应用场景如下:
#include <iostream> using namespace std; class A { public: A(int x) { cout<<"x : "<<x<<endl; } }; int main() { A a = 5; return 0; }
如果要防止 类的构造函数或者拷贝构造函数隐式转化,需要用explicit 来修饰:
#include <iostream> using namespace std; class A { public: explicit A(int x) { cout<<"x : "<<x<<endl; } }; int main() { A a = 5;//编译不通过,不能支持构造函数的隐式调用 return 0; }
禁止复制问题:
如果要禁止用户对当前类进行复制,比如说 iostream类,是不允许用户复制的,这种情况下如何实现呢?可以通过 复制构造函数私有化来阻止当前 用户对当前类的复制(private);
但是这会出现一个问题 类中友员函数 或者 类的成员函数可以调用类的私用复制构造函数或者私有构造函数,如何来解决这个问题呢?
可以通过采用对 私有的复制构造函数 只声明 不定义,函数是可以声明但不定义的,但是 不没有定义的函数 是不能被调用的,所以这种办法可以解决禁止复制的问题。