C++构造函数与析构函数及调用顺序

构造函数与析构函数及调用顺序

  • 构造函数
    • 定义
    • 特点
  • 析构函数
    • 定义
    • 特点
  • 构造函数与析构函数的执行顺序
  • 例题

构造函数

定义

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。

特点

构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主要任务并不是开空间创建对象,而是初始化对象。初始化只能初始化一次,而构造函数体内可以多次赋值。

其特征如下:

  1. 函数名与类名相同。
  2. 无返回值。
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数可以重载。
  5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
  6. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。
  7. 而构造函数体内可以多次赋值。
class Date
{
public:
 Date(int year, int month, int day)
 : _year(year)
 , _month(month)
 , _day(day)
 {}
private:
 int _year;
 int _month;
 int _day;
};

关于构造函数,值得注意的是:
1.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
2. 类中包含以下成员,必须放在初始化列表位置进行初始化:
2.1 引用成员变量
2.2 const成员变量
2.3 自定义类型成员(该类没有默认构造函数)
3. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。
4.成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。
5.static 成员
5.1概念:声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化。(重点!!!)
5.2特点:
5.2.1. 静态成员为所有类对象所共享,不属于某个具体的实例
5.2.2. 静态成员变量必须在类外定义,定义时不添加static关键字
5.2.3. 类静态成员即可用类名::静态成员或者对象.静态成员来访问
5.2.4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
5.2.5. 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

析构函数

定义

**析构函数:**与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。

特点

析构函数是特殊的成员函数。
其特征如下:

  1. 析构函数名是在类名前加上字符 ~。
  2. 无参数无返回值。
  3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
  4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。
  5. 编译器自动生成的默认析构函数,对会自定类型成员调用它的析构函数。

构造函数与析构函数的执行顺序

  1. 构造顺序是按照语句的顺序进行构造,析构是按照构造的相反顺序进行析构。
  2. 对象析构要在生存作用域结束的时候才进行析构。
  3. 类的析构函数调用完全按照构造函数调用的相反顺序进行调用。
  4. 全局对象先于局部对象进行构造。
  5. 静态对象先于普通对象进行构造。

例题

设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为?( )

C c;
int main()
{
	A a;
	B b;
	static D d;
	
	return 0;
}

根据上述所给概念,构造函数的执行顺序应为:C D A B
析构函数执行顺序则应为:B A D C

你可能感兴趣的:(c++,类,编程语言)