关于c++构造函数

时间:2022-07-08 01:29:55

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 }