默认构造函数之编译器的约定

      每个对象在创建的时候都会调用构造函数来为自己进行初始化。如果我们在类中并没有提供现成的构造函数,那么编译器就会自动创建一个默认地构造函数,它什么都不会做,只会对我们所定义的对象进行初始化操作。比如说有一个类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 ,搞定,收工!!!

posted @ 2017-05-26 15:45  杨铭宇  阅读(134)  评论(0编辑  收藏  举报
友情链接:回力球鞋 | 中老年女装 | 武汉英语学校 | 雅思备考 | 托福备考