构造函数体中仅仅是进行了赋值操作。
区分 初始化 和 赋值
构造函数的初始化列表:
Data(int year=1.int month=2, int day=3)
:_year(year)
,_month(month)
,_day(day)
{}
初始化列表:完成类中各个成员变量的初始化(只能进行一次初始化),初始化次序按照成员变量在类中的声明次序进行初始化。
初始化列表中各个成员变量的出现的先后顺序与初始化次序无关
建议:声明次序要保持一致,尽量避免使用 成员 初始化成员
explicit 关键字 放在构造函数前面 可以把单参数构造函数的隐式类型转换功能进行限制。
默认构造函数
感觉自己需要,一定是无参的,一定有其特定作用
A类(有缺省的构造函数) B(没有显式定义):包含A类的对象
关于传参(传 类类型)的优化
传参:T&,const T& (少创建一个对象,提高了效率)
返回值:能返回引用,尽量返回引用类型
const 类型的成员变量!
const成员变量:必须在构造函数的初始化列表中初始化
const成员函数:const 实际修饰this,this类型:const T* const;不能修改类中的“成员变量”
mutable修饰的类成员变量可以在const成员函数中修改
友元
可以在类外直接访问一个类中的私有的成员变量,声明时需要加friend关键字
友元函数:<<
友元类
静态成员
要在类外进行初始化
用 static 修饰 成员变量,静态成员变量
用 static 修饰 成员函数,静态成员函数
静态成员变量要在类内声明,类外使用,在计算类的大小时,不包括静态成员
静态成员变量是所有对象所共享的
访问静态成员的两种形式:
//假设有一类 Test;有静态成员变量a:static int a;
//法一:通过类名+作用域
Test::a = 10;
//法二:通过对象
Test t1;
t1.a = 10;
普通成员函数不能通过法一来调用。
在静态成员函数中访问普通成员变量 会 失败。也就是:静态成员函数 不能访问 非静态的成员(普通成员变量和成员函数)。
- 原因:类的静态成员函数没有默认的this指针,因此在它里面不能使用任何 非静态成员
++注意和C语言里面的static区分++
static 修饰 变量和函数:
static变量:
- 全局变量:static int a; static int b = 2;
- 局部变量:static int a; static int b = 2;
extern
static修饰类成员:
- 变量:
- 在类内完成声明,在类外完成定义,类外就不用加static了。类名::
- 所有类对象共享,不属于某个具体对象,是类属性
- sizeof(对象),不包含静态成员变量
- 对象.静态成员变量名称–》类型::静态成员变量名称
- 不能再构造函数初始化列表
- 成员函数:
- 本质:静态成员函数没有this指针,普通成员函数有隐藏的this指针
- 可以不用通过对象来调用:这样来:
对象:静态成员函数名字==》类型::静态成员变量名称
在静态成员函数中访问普通成员变量 会 失败