1 构造函数是特殊的成员函数,一般声明为公有的
2 创建类类型的新对象,系统自动会调用构造函数,而且只调用一次,不允许人工调用
3 构造函数是为了保证对象的每个数据成员都被正确初始化
函数名和类名完全相同
不能定义构造函数的类型(也不能有返回类型),也不能使用void
通常情况下构造函数应声明为公有函数,否则它不能像其他成员函数那样被显式地调用
构造函数被声明为私有有特殊的用途。
构造函数可以有任意类型和任意个数的参数,一个类可以有多个构造函数(重载)
构造函数形参的名字和类中成员的名字不能定义成相同的
关于析构函数的总结:
1 函数名和类名相似(前面多了一个字符“~”)
2 没有返回类型
3 没有参数
4 析构函数不能被重载
5 如果没有定义析构函数,编译器会自动生成一个默认析构函数,其格式如下:
类名::~默认析构函数名( )
{
}
6 默认析构函数是一个空函数。
1 例子1: 2 class Test 3 { 4 public: 5 // 如果类不提供任何一个构造函数,系统将为我们提供一个不带参数的 6 // 默认的构造函数 7 Test(); 8 private: 9 int num_; 10 }; 11 12 // 不带参数的构造函数称为默认构造函数 13 Test::Test() 14 { 15 num_ = 0; 16 cout<<"Initializing Default"<<endl; 17 }
1 例子2: 2 class Test 3 { 4 public: 5 // 如果类不提供任何一个构造函数,系统将为我们提供一个不带参数的 6 // 默认的构造函数 7 //Test(); 8 Test(int num); 9 void Display(); 10 11 private: 12 int num_; 13 }; 14 15 Test::Test(int num) 16 { 17 num_ = num; 18 cout<<"Initializing "<<num_<<endl; 19 } 20 21 void Test::Display() 22 { 23 cout<<"num="<<num_<<endl; 24 } 25 26 int main(void) 27 { 28 Test t;//这句话的意思就是希望调用1个不带参数的构造函数,而我们已经建了1个带参数的构造函数,系统是不会再给我们1个不带参数的构造函数的 29 t.Display(); 30 return 0; 31 } 32 //这时就会报错 因为我们自己构建了1个带参数的构造函数,系统就不会给我们建一个构造函数 33 //如果是下面这样调用就不会有错误 34 int main(void) 35 { 36 Test t(10);//新建一个对象 37 t.Display(); 38 return 0; 39 }
1 例子3: 2 class Test 3 { 4 public: 5 6 Test(); 7 Test(int num);//这两个构造函数构成重载 8 void Display(); 9 ~Test();//析构函数不能够被重载,也就意味着析构函数不能有参数 10 private: 11 int num_; 12 }; 13 14 Test::Test() 15 { 16 num_ = 0; 17 cout<<"Initializing Default"<<endl; 18 } 19 20 Test::Test(int num) 21 { 22 num_ = num; 23 cout<<"Initializing "<<num_<<endl;//这句话是把 Initializing和num_都输出,而不是只输出Initializing 24 } 25 26 Test::~Test() 27 { 28 cout<<"Destroy "<<num_<<endl; 29 } 30 31 void Test::Display() 32 { 33 cout<<"num="<<num_<<endl; 34 } 35 36 int main(void) 37 { 38 Test t; 39 t.Display(); 40 41 Test t2(10); 42 t2.Display(); 43 return 0; 44 }