关于结构体和类的构造函数

首先,如果在创建结构体或者类的时候不提供自定义的构造函数(constructor),编译器会提供一个默认的构造函数,即什么都不做;

但是一旦自己提供了自定义的构造函数的话,那么久必须同时提供一个显式的默认构造函数,否则在定义和初始化的时候将必须使用自定义的构造函数而没有默认构造函数可用。

比如

struct stock {
    int val;
    int num;
};
stock* s = new stock;
stock* s1 = new stock();
stock* s2 = new stock[3];

都是可以的,这三条语句都将调用编译器提供的默认构造函数 但是假如提供了自定义的构造函数

struct stock {
    int val;
    int num;
    stock(int a, int b) {
        val = a;
        num = b;
    }
};

stock* s = new stock;
stock* s1 = new stock();
stock* s2 = new stock[3];
stock* s3 = new stock(1, 2);

前三条语句将会出错,系统会提示 “stock 没有默认构造函数”,只有第四条调用了自定义构造函数的语句可以成功定义并初始化一个 stock 结构体。

但是我们只要给 stock 显式的提供一个默认构造函数 stock(); 就可以重新使用默认构造函数了

struct stock {
    int val;
    int num;
    stock(int a, int b) {
        val = a;
        num = b;
    }
    stock(){};
};

stock* s = new stock;
stock* s1 = new stock();
stock* s2 = new stock[3];
stock* s3 = new stock(1, 2);

这样,四条初始化语句就都是合法的了