默认构造函数之编译器的约定
每个对象在创建的时候都会调用构造函数来为自己进行初始化。如果我们在类中并没有提供现成的构造函数,那么编译器就会自动创建一个默认地构造函数,它什么都不会做,只会对我们所定义的对象进行初始化操作。比如说有一个类A,如果在这个类里面我们并没有提供一个构造函数,那么编译器就会自动为我们创建一个不带参数,函数体为空的默认构造函数:
A::A() {} |
但是值得注意的一点是,如果我们自己在类中已经创建了一个构造函数,那么不管你创建的是像上面这样的默认构造函数,还是一个带有参数的构造函数,编译器都不会再为你提供任何默认构造函数。如下面这个程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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行中,我们自己声明了一个默认构造函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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 ,搞定,收工!!!