默认构造函数之编译器的约定
每个对象在创建的时候都会调用构造函数来为自己进行初始化。如果我们在类中并没有提供现成的构造函数,那么编译器就会自动创建一个默认地构造函数,它什么都不会做,只会对我们所定义的对象进行初始化操作。比如说有一个类A,如果在这个类里面我们并没有提供一个构造函数,那么编译器就会自动为我们创建一个不带参数,函数体为空的默认构造函数:
A::A() {}
但是值得注意的一点是,如果我们自己在类中已经创建了一个构造函数,那么不管你创建的是像上面这样的默认构造函数,还是一个带有参数的构造函数,编译器都不会再为你提供任何默认构造函数。如下面这个程序:
class demo{ public: demo(int i){x=i;} int print(){return x;} private: int x; }; #include <iostream> using namespace std; int main() { demo *a=new demo; demo *b=new demo(1); cout<<b->print()<<endl; }
在程序的第14行我们声明了一个对象a,但是与15行不同的是,我们想在这里对a调用默认构造函数,希望它能够被编译器自己提供的默认构造函数所初始化。但是当我们一运行的时候,程序就报错了:“error C2512: “demo”: 没有合适的默认构造函数可用”。
上面这个例子说明了,如果我们创建了一个构造函数之后,那么如果想要调用编译器自己的默认构造函数,我们就必须在类中自己声明一个默认构造函数:
demo() {};
那么,程序变成如下所示(在这个程序第3行中,我们自己声明了一个默认构造函数:
class demo{ public: demo(){}; demo(int i){x=i;} int print(){return x;} private: int x; }; #include <iostream> using namespace std; int main() { demo *a=new demo; demo *b=new demo(1); cout<<b->print()<<endl; }
只有这样,程序才能够顺利运行,输出如下:
ok ,搞定,收工!!!