再谈构造函数:
构造函数赋值:
在创建对象时,编译器会自动调用构造函数进行赋值,之前简单来说叫初始化,但这里不能叫做初始化,因为初始化只能初始化一次,在构造函数体内可以重复赋值,所以出现了初始化列表。
初始化列表:
以一个:(冒号)开始,接着是以,(逗号)分隔的数据成员列表,每个”成员变量“后面跟一个放在括号中的初始值或表达式
Date(int year, int month, int day)
:_year(year)
,_month(month)
,_day(day)
{ }
注意:
1.每个成员变量在初始化列表中只能出现一次(对应初始化只能初始化一次)
2.类中包含以下成员,必须放在初始化列表位置进行初始化:
引用成员变量
const成员变量
自定义类型成员(该类没有默认构造函数)
private:
int& _ref;//引用
const int_n;//const
A _obj;//没有默认构造函数
为什么是这三个?因为这三个必须要在定义时初始化(恰恰符合初始化列表的性质)
成员初始化阶段完成后,才会执行构造函数体中的代码。构造函数体中的代码主要用于对对象进行进一步的设置和操作,本质上是对已经初始化的成员变量进行赋值或其他操作。
{ }里面是构造函数体内赋值
简单来说,就是分为两个阶段,一个是初始化列表初始化,一个是函数体内赋值
如果初始化时没有初始化,也就是上述三种情况,就会导致编译不过去(即使你在函数体内赋值)
它连第一阶段都过不去,自然不会去第二阶段
3.尽量使用初始化列表初始化,因为不管你使用不使用,都会先使用初始化列表初始化
4.成员变量在类中声明的顺序就是初始化列表初始化的顺序,所以建议初始化列表里的顺序与声明 时候的顺序一样。
static成员
概念:用static修饰的成员变量叫类的静态成员,用static修饰的成员变量叫类的静态成员函数
注意:
1.静态成员不属于哪个对象,是属于类的所有对象,大家共用一个,静态成员存储在静态区
静态成员函数存储在代码段
2.静态成员变量必须在类外定义,定义时不添加static关键字
3.类静态成员变量用类名加::静态成员或者对象.静态成员来访问(int Date::_count = 0;)
4.静态成员函数没有隐含的this指针,不能访问任何非静态成员
5.静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值
友元函数:
友元分为友元函数和友元类,提供了一种突破封装的方式,但会增加耦合度(建议少用)
这与前面的操作符重载做解释,当操作符重载定义在类外面就没有隐含的this指针,所以只能访问public,友元的作用就在此。
假设一种情况,操作符重载<<,重载时会与cout冲突,因为cout占了第一个位置,本来是传参时传给隐含的this指针的参数,所以只能定义在类外面,但这又不能访问类内私有的成员,所以这时候要用友元函数
友元函数可以直接访问类内的私有成员,是定义在类外的普通函数,不属于任何类,但需要在类的内部声明,并且加上friend关键字。
注意:
1.友元函数可以访问类内的成员变量,但不是类的成员函数
2.友元函数不能用const修饰,因为没有隐含的this指针
友元类
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类的所有非公有成员
在class student类中声明friend class Date,Date中的所有函数都可以访问student中的所有非公有成员
5万+

被折叠的 条评论
为什么被折叠?



