1.访问类的成员
类的话,如果用类的对象访问,就使用对象名.成员名 来访问成员
如果用指向这个对象的指针来访问,就使用指针名->成员名 来访问成员
struct student { int a; char name[100]; void func() {}; }; student stu; stu.a = 100; stycpy_s(stu.name, sizeof(stu.name), "zhangsan"); student * pstu = & stu; pstu->a = 10000;
类中public修饰的成员就是类的访问接口,供外界调用
private实现各种功能的细节方法,但不暴露给外界(使用者),使用者无法使用这些private成员
struct默认是public,class则是private
2.类声明
类定义放在一个头文件中,而多个cpp文件中都包含这个头文件,那不就相当于这个类定义了多次吗?我们知道一个变量不允许定义多次,一个类难道允许定义多次?这个确实允许的,类是特殊的存在,这一点与定义一个全局变量不同,所以很多人也把类定义称为类声明
3.构造函数的参数
1.构造函数的默认参数,也就是Time(int a, int b = 10),所以b就是默认参数
在具有多个参数时,默认参数都必须在非默认参数的右边,一旦为某个参数指定默认值,则它后面的参数也必须指定默认值
所以可以直接这样调用 Time myTime{12},也就是a为12
这时候不能再有这样的构造函数Time(int a),因为系统不知道你是要哪个
2.单参数构造函数的话,总结一下
Time mytime = {16}; 这种写法一般认为是正常的,带一个参数16,可以让系统明确调用带一个参数的构造函数
Time mytime1 = 16; 这就存在临时对象或者隐式转换的问题,因为这相当于调用单参数构造函数,生成一个临时对象,把临时对象的值,赋值到了mytime1的成员变量里
void func(Time myt)
{
return
}
func(16),这也存在临时对象或者隐式转换的问题
用explicit(显式)就可以强制系统明确要求不能做隐式转换
比如把构造函数都加上后,像这种explicit Time(int hour, int min, int sec);
此时Time mytime2 = {12, 13, 14)报错
而Time mytime3 {12, 13, 14)没有报错,能成功创建对象
这说明一个问题:有了这个等号,就变成了一个隐式初始化(其实是构造并初始化),省略这个等号,变成了显式初始化(也叫作直接初始化)
那这样怎么改上面那三个的代码呢
Time mytime = {16};
Time mytime1 = 16;
func(16)
这样改:
Time mytime = Time(16); //或者Time{16}
func(Time(16)); //临时构造一个对象
总结:一般来说,单参数的构造函数都声明为explicit,除非有特别原因
构造初始化列表
Time::Time(int temphour, int tmpmin, int tmpsec)
:Hour(tmphour), Minute(tmpmin)
尽量不要某个成员变量依赖另一个,比如
Time::Time(int temphour, int tmpmin, int tmpsec)
:Hour(tmphour), Minute(Hour)
因为赋值顺序不是按照这个左右,而是按照成员变量在类的定义顺序