复制构造函数
基本概念
复制构造参数只有一个参数,即对同类对象的引用,形如:X::X(X&) 或 X::X(const X&),常用后者。
若用户未定义,则编辑器会生成默认的复制构造函数,完成复制的功能。
class Complex {
private:
double real,imag;
};
Complex c1; //调用缺省无参构造函数
Complex c2(c1);//调用缺省的复制构造函数,将 c2 初始化成和c1一样
注:不允许有形如X::X(X)的构造函数。
调用的三种时机
- 当用一个对象去初始化同类的另一个对象时。
Complex c2(c1);
Complex c2 = c1; //初始化语句,非赋值语句
- 如果某函数有一个参数是类 A 的对象, 那么该函数被调用时,类A的复制构造函数将被调用。
class A
{
public:
A() { };
A(A & a) {//重写复制构造函数
cout << "Copy constructor called" <<endl;
}
};
void Func(A a1){ }
int main(){
A a2;
Func(a2);//程序输出:Copy constructor called
return 0;
}
- 如果函数的返回值是类A的对象时,则函数返回时, A的复制构造函数被调用。
class A
{
public:
int v;
A(int n) { v = n; };
A(const A & a) {//重写复制构造函数
v = a.v;
cout << "Copy constructor called" <<endl;
}
};
A Func() {
A b(4);
return b;
}
int main() {
cout << Func().v << endl;
return 0;
}
类型转换构造函数
基本概念
只有一个参数,而且不是复制构造函数的构造函数,一般就可以看作是类型转换构造函数。
当需要的时候,编译系统会自动调用转换构造函数,建立一个无名的临时对象(或临时变量)。
目的
实现类型的自动转换。
class Complex {
public:
double real, imag;
Complex(int i) {//类型转换构造函数
cout << "IntConstructor called" << endl;
real = i; imag = 0;
}
Complex(double r,double i) {//构造函数
real = r;
imag = i;
}
};
int main ()
{
Complex c1(7,8);
Complex c2 = 12;
c1 = 9; // 9被自动转换成一个临时Complex对象
cout << c1.real << "," << c1.imag << endl;
return 0;
}