class Complex{
private:
double real, imag; //实部和虚部
public:
void Set(double r, double i); //设置实部和虚部
};
上面这个 Complex 类代表复数,没有编写构造函数,因此编译器会为 Complex 类自动生成一个无参的构造函数。Complex c; //c用无参构造函数初始化 Complex *p = new Complex; //对象 *p 用无参构造函数初始化如果为 Complex 类编写了构造闲数,如下所示:
class Complex{
private:
double real, imag;
public:
Complex(double r, double i = 0); //第二个参数的默认值为0
};
Complex::Complex(double r,double i){
real = r;
imag = i;
}
那么以下语句有的能够编译通过,有的则不行:
Complex cl; //错,Complex 类没有无参构造函数(默认构造函数) Complex* pc = new Complex; //错,Complex 类没有默认构造函数 Complex c2(2); //正确,相当于 Complex c2(2, 0) Complex c3(2, 4), c4(3, 5); //正确 Complex* pc2 = new Complex(3, 4); //正确C++ 规定,任何对象生成时都一定会调用构造闲数进行初始化。第 1 行通过变量定义的方式生成了 c1 对象,第 2 行通过动态内存分配生成了一个 Complex 对象,这两条语句均没有涉及任何关于构造函数参数的信息,因此编译器会认为这两个对象应该用默认构造函数初始化。可是 Complex 类已经有了一个构造函数,编译器就不会自动生成默认构造函数,于是 Complex 类就不存在默认构造函数,所以上述两条语句就无法完成对象的初始化,导致编译时报错。
class Complex{
private:
double real, imag;
public:
Complex(double r);
Complex(double r, double i);
Complex(Complex cl, Complex c2);
};
Complex::Complex(double r) //构造函数 1
{
real = r;
imag = 0;
}
Complex :: Complex(double r, double i) //构造数 2
{
real = r;
imag = i;
}
Complex :: Complex(Complex cl, Complex c2) //构造函数 3
{
real = cl.real + c2.real;
imag = cl.imag + c2.imag;
}
int main(){
Complex cl(3), c2(1,2), c3(cl,c2), c4 = 7;
return 0;
}
根据参数个数和类型要匹配的原则,c1、c2、c3、c4 分别用构造函数 1、构造函数 2、构造函数 3 和构造函数 4 进行初始化。初始化的结果是:c1.real = 3,c1.imag = 0 (不妨表示为 c1 = {3, 0}),c2 = {1, 2},c3 = {4, 2}, c4 = {7, 0}。
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有