1.类的定义中实现的成员函数定义
直接在类的定义中实现的成员函数定义,会被当做inline内联函数来处理,但毕竟这只是对编译器的建议,能不能内联成功,取决于编译器,所以成员函数定义体尽量写的简单一些,增加被内联的概率
2.常量成员函数
对于成员函数的声明和实现代码分开的情况下,要记得再成员函数的声明中增加const,也在实现中增加const,都是在成员函数末尾加
加的作用是告诉系统,这个成员函数不会修改该对象里面的任何成员变量的值,也就是这个成员函数不会改变这个对象的状态
这种也叫作常量成员函数
void noone() const { Hour += 10; //错误,成员函数不可以修改成员变量的值 } const Time abc; abc.addhour(12); //错误,因为addhour成员函数不是const,只能被非cosnt对象调用 abc.noone();//正确,因为noone是const Time def; def.noone();//const成员函数,可以被非const和const对象对象,也就是万人迷,而非const成员函数只能被非const对象调用
普通函数(非成员函数)末尾不能加const,编译都通不过,因为const在函数末尾的意思是,成员函数不会修改对象里面任何成员变量值,而普通函数没有对象这个概念
3.mutable
mutable翻译成中文,是不稳定的,容易改变的意思,与const反着来,而且mutable的引入也是为了突破const的限制
假如咱们写的const成员函数,需要修改成员变量的值,那怎么办,删掉const吗,那这样的话,cosnt对象就不能再调用这个非const成员函数了,所以引入了mutable来修饰一个成员变量,表示这个变量永远处在可变状态,即使在const结尾修饰的成员函数中
mutable int myHour; void noone() const { myHour += 3; //现在就可以修改了 }
4.static在类里面的作用
static在类里面的作用,定义的变量和函数,是属于类的,而不是属于某个对象的,并且在定义的函数中,与对象有关的成员变量不能出现在它定义的函数中,声明的时候用static,定义的话不用加
5.使用类的构造函数初始化列表或在构造函数中给Second值,该值会覆盖掉初始值
例如在类里面已经定义了int Second = 0;
构造函数是这样的
Time::Time(int tmphour, int tmpmin, int tmpsec) :Second(tmpsec) //通过初始化列表来给Second值或者 { Second = tmpsec; //通过赋值来给Second值 }
6.cosnt成员变量的初始化
对于类的const成员,只能使用初始化列表来初始化,而不能在构造函数内部进行赋值操作
比如在类声明里面,有const int testvalue //当然这里可以给初值,比如const int testvalue = 19;
那么在构造函数定义中,代码应该如下
Time::Time(int tmphour, int tmpmin, int tmpsec) :Hour(tmphour), Minute(tmpmin), testvalue(18) { testvalue = 6; //不可以在这里初始化testvalue }
上面创建testvalue这种常量属性的变量时,Time构造函数完成初始化以后,也就是Time::Time(int tmphour, int tmpmin, int tmpsec)
:Hour(tmphour), Minute(tmpmin), testvalue(18)执行完后,testvalue才真正具备了const属性,在构造testvalue这个const变量(对象)过程中,Time构造函数可以向其内部写值,如上面的testvalue(18),因为构造函数要进行很多看得见和看不见的写值操作,所以构造函数不能声明为const的
一旦程序员书写了自己的构造函数,那么在创建对象的时候,必须提供与其书写的构造函数形参相符合的实参,才能成功创建对象