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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。