本篇文章是对浅谈C嘎嘎类与对象的拓展
初始化列表(初始化)
格式:类名(类型 形参1, 类型 形参2)
:(冒号) 变量【类中声明的变量】(形参1)
, 变量【类中声明的变量】(形参2)//当然这里除了可以放变量外也可以是表达式
{}
例子:
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. const成员变量
3. 没有默认构造的类类型变量
那么什么是默认构造
这是我先前没有总结过的一个点,那么现在补上
以上三个构造函数就是默认构造函数,因此大家可别不认识哈,当然啦初始化尽量走初始化列表
当然,有的书上会这么写,但是大家注意这里不是定义还是声明,并且这个1是缺省值,是给初始化列表使用
那么这里还有一点需要注意的是这里的初始化不会根据初始化列表的的排序进行初始化,而是根据private部分中的声明顺序来初始化
static静态符
1. ⽤static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进⾏初始化
2. 静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区
3. ⽤static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
4. 静态成员函数中可以访问其他的静态成员,但是不能访问⾮静态的,因为没有this指针。
5. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍
6. ⾮静态的成员函数,可以访问任意的静态成员变量和静态成员函数
7. 突破类域就可以访问静态成员,可以通过类名::静态成员或者对象.静态成员来访问静态成员变量 和静态成员函数
注意:静态成员变量需要在类外进行初始化
那么大家来看看这道题
我们先看第一问构造函数的调用顺序:
首先c是全局变量,且c变量的创建在main函数之前,因此初始化必然先从变量c开始,在c初始化完成后main函数就建立了,那么a和b则是根据定义的顺序来初始化。d是静态变量,而初始化d则必须要程序运行到静态变量处才能初始化。
因此答案是c a b d
那么我们来看看第二问析构函数的顺序:
首先析构函数需要从局部变量开始析构,而析构的原有顺序是后定义的变量先析构,因此只有选项abc符合要求,静态变量(d)的生命周期是全局的,并且静态变量d处于局部,因此先析构d,析构完d后再析构c
因此答案是 b a d c
小总结:
1. 全局变量优先初始化,静态变量的初始化需要程序运行到静态变量的位置后才能初始化
2. 析构的顺序后定义的先析构
3.. 静态变量的生命周期是全局
4.处于局部的静态变量优先析构
匿名对象
顾名思义就是没有名字的对象,我们先来看一下有名字的对象
有名字的对象
A hanfei();
A是类 类型 hanfei就是对象名
匿名对象
A();
注意:匿名对象的生命周期很短,只有它所在的那一行,但是它也有续命的方法,这个我们后续介绍。
那么今天内容就先到这里,想知道后面内容的童鞋可以给我点个关注,我们下期见。