C++中的构造函数(constructor)用法

  • 构造函数(constructor)是一个特殊的类方法,它是在初始化对象时调用的类中的方法。有以下几个关键点:
    1. 构造函数调用时可以对类中的属性赋值以及输出相应的提示语句
    2. 构造函数无返回类型和返回值
    3. 一个类可以拥有多个构造函数
      例如下面的程序:
#include <iostream>
using namespace std;

class Complex{
    double re;
    double im;
public:
    Complex(const double r, const double i){ //带参数的构造函数
        cout << "调用构造函数:\n";
        re = r;
        im = i;
    }
    string text(){
        stringstream ss;
        ss << re << " + " << im << "j";
        return ss.str();
    }
};

int main(){
    Complex a = {1.0, 2.0}; //此处调用构造函数Complex
    cout << "a = " << a.text();
    Complex b = {4.0, 5.0}; //再次调用构造函数Complex
    cout << "b = " << b.text();
}

输出结果:

上述函数中,并没有调用Complex但复数a和b的实部和虚部却被自动分配好了,这就是构造函数,在类被实例化(即分配对象时)被自动调用。如果一个类中没有构造函数,则编译系统会默认补上一个空的构造函数。但是如果自行在类中添加了构造函数,系统将不会自动再补一个构造函数。因此,如果有构造函数存在,那么对类实例化时必须与构造函数的格式相同。例如:

#include <iostream>
using namespace std;

class Complex{
    double re;
    double im;
public:
    Complex(const double r, const double i){
        cout << "调用构造函数\n";
        re = r;
        im = i;
    }
    double getReal() const{
        return re;
    }
    double getImag() const{
        return im;
    }
    Complex mul(const Complex& z){
        Complex s; //此处将产生编译错误,因为这里实例化类Complex时和构造函数的格式不一样
        Complex s = {0.0, 0.0}; //这种格式正确
        s.re = re * z.getReal() - im * z.getImag();
        s.im = re * z.getImag() + im * z.getReal();
    }
int main(){
}

一个类中可以拥有多个构造函数。例如下面的程序,用以求一个复数的模以及与另一个复数相乘的结果:

#include <iostream>
#include <string>
#include <sstream>
#include <cmath>
using namespace std;

class Complex{
    double re;
    double im;
public:
    Complex(){
        cout << "调用默认构造函数\n";
    }

    Complex(const double r, const double i){ //带参数的构造函数
        cout << "调用构造函数:\n";
        re = r;
        im = i;
    }

    void setValue(const double r, const double i){
        re = r;
        im = i;
    }

    double getReal()const{
        return re;
    }

    double getImag()const{
        return im;
    }

    double amount(){  //计算模
        return sqrt(re * re + im * im);
    }

    Complex mul(const Complex& z){
        Complex s; //这里将调用默认构造函数
        s.setValue((re * z.getReal() - im * z.getImag()), (re * z.getImag() + im * z.getReal()));
        return s;
    }

    string text(){
        stringstream ss;
        ss << re << " + " << im << "j" << endl;
        return ss.str();
    }
};

int main(){
    Complex a = {1.0, 2.0}; //此处调用构造函数Complex
    cout << "a = " << a.text();
    Complex b = {4.0, 5.0}; //再次调用构造函数Complex
    cout << "b = " << b.text();
    Complex c; //这里将调用默认构造函数
    c = a.mul(b);
    cout << "c = " << c.text();
}

输出结果:

以上函数两个构造函数分别调用了两次,这就是构造函数的多种不同构造。

如有错误,欢迎大家批评与指正!

猜你喜欢

转载自blog.csdn.net/WJ_SHI/article/details/82084876