面向对象的编程——构造函数和析构函数(1)
构造函数与类同名我们以此来标识构造函数为了声明一个缺省的构造函数,构造函数上惟一的语法限制是它不能指定返回类型甚至void 也不行,C++语言对于一个类可以声明多少个构造函数没有限制,只要每个构造函数的参数表是惟一的即可。
析构函数是一个特殊的由用户定义的成员函数当该类的对象离开了它的域或者delete表达式应用到一个该类的对象的指针上时析构函数会自动被调用,析构函数的名字是在类名前加上波浪线(~),它不返回任何值,也没有任何参数,因为它不能指定任何参数。所以它也不能被重载。尽管我们可以为一个类定义多个构造函数但是我们只能提供一个析构函数,它将被应用在类的所有对象上。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class B
{
private:
int data;
public:
B()
{
cout<<"default constructor"<<endl;
}
~B()
{
cout<<"destructed"<<endl;
}
B(int i):data(i)
{
cout<<"constructed by parameter"<<data<<endl;
}
} ;
B Play(B b)
{
return b;
}
int main(int argc,char* argv[])
{
B temp=Play(5);
return 0;
}
上述程序的运行结果如下:
可以很清楚的看到,调用了一次构造函数,而且是带有参数的那一个,那为什么会这样呢?对此,我们有好几个疑问,第一,为什么在“B temp ”这里没有调用?第二,在”Play(5)”这是怎么调用构造函数的?
也可以看到,析构函数调用了两次,一次是“Play(5)”返回时,参数的析构函数被调用;第二次是temp的析构函数调用;temp的构造函数调用的其实是编译器生成的拷贝构造函数。