inline
class Time
{
public:
Time();
Time(int hour, int min, int psec);
public:
int m_hour;
int m_min;
int m_psec;
public:
void addhour(int tmphour)
{
m_hour += tmphour;
}
};
如上代码,addhour这种直接在类定义中实现的成员函数会被当做inline内联函数来处理
内联函数:系统尝试用函数体内的代码直接取代函数调用代码, 已提高程序运行效率.
内联函数只能对编译器的建议,能不能inline成功,依旧取决于编辑器,所以成员函数的定义体尽量写的简单,以增加被inline成功的概率.
inline一般写在头文件里,多个cpp文件重复包含也是没有问题的,不会报函数重定义错误
const(类中用法)
const常量在类中的使用:
比较常用的用法是在类的成员函数的末尾增加一个const
void Time::node() const //注:这里是类内的成员函数
{
//m_hour += 10; //错误,常量成员成员函数不可以直接修改成员变量的值
..
}
在写法上:对于成员函数的声明和实现代码分开的时候,不但要在声明中函数末尾加const,也要在成员函数的实现中增加const.
作用:成员函数中的const起到的作用就是,告诉系统,这个成员函数不会修改改对象里面的任何成员变量的值,这个成员函数不会修改对象的任何状态.同样,你更改编译器也会报错
调用:
const Time abc; //定义const对象,
//abc.addhour(123); 报错,addhour成员函数是非const,只能被非const对象调用
abc.node(); //可以,node成员函数是const,
Time def; //这里再定义一个非const对象
def.node(); //这个也是可以的,非const可以调用const成员函数
补充:普通函数末尾不能加const,const加载函数末尾的意思就是"成员函数不会修改该对象里面任何成员变量值",普通函数没有对象的概念,所以不能放普通函数末尾
mutable
在const修饰的成员函数中,不允许更改成员变量的值,那mutable就可以解决const的限制.
在不去掉const 的情况下修改成员变量.
//用法:定义的时候加mutable
mutable int myHour;
void node() const
{
myHour += 3; //可以修改了,myHour有mutable修饰
}
简单做一个了解,知道其功能,实际作用具体程序实现中再看.
this
介绍:this用在成员函数中是一个隐藏起来的函数参数,表示是的是指向本对象的指针
//定义
Time abc;
abc.test();
void time::test()
{
m_hour = 123; //等价于 this->m_hour = 123;
}
理解: 调用成员函数时,编译器负责把调用这个成员函数的对象的地址传递给这个成员函数中一个隐藏的this形参中,例如abc.test();中,编辑器在内部重写了这个test()函数.
在编译器中你可以这样理解:
//函数
void time::test(Time* const this, int tmphour) { ... }
//调用
abc.test(&abc);
注意:
1.this指针只能在成员函数中使用,全局函数,静态函数都不能使用this指针.
2.在普通成员函数中,this是一个指向非const对象的const指针,表示this只能指向这一个对象(上面例子中的Time* const this)
3.在const成员函数中,this是一个指向const对象的const指针,表示this既不能指向别的对象,还不能更改成员变量的值(const Time *const this)
注:如果成员变量名和形参名一样,可以用this区分,尽量不要写一样
static
复习:
(1)函数内部在定义一个局部变量时,在前面使用static关键字,则该变量会保持在静态存储区,在编译的时候被初始化,如果不给初始值,他的值会被初始化为0;
下次调用该函数时该变量保持上次离开该函数时的值
void func()
{
static int a = 1; //静态存储区
a = 8; //第二次以后调用,a直接等于8,不会初始化为1
}
//局部静态变量
(2)在定义全局变量时前面使用static关键字,那么该全局变量只能在本文件中使用,无法在其他文件中被引用(使用)
(3)在函数定义之前增加static,那么该函数只能在本源程序文件中调用,无法在其他源文件中调用
类中的用法:
在类中,static成员变量(静态成员变量),其特点是:不属于某个对象,而是属于整个类,是一个公用的变量,静态成员变量可以通过对象名来修改,也可以通过类名修改,一旦通过对象修改了这个成员变量的值,则在其他改类对象中也能够直接看到修改后的结果
声明:
public:
static int mystatic; //声明静态成员变量,但是没定义
static void mstafunc(int testvalue); //声明静态成员函数
// 与普通成员变量不同的是,普通成员变量定义一个类对象时,就已经分配内存了;\
而静态如果使用,必须定义这个成员变量,也就是给静态成员变量分配内存
定义:
一般在某个.cpp源文件的开头来定义这个静态成员函数,这样能够保证在调用任何函数之前这个静态成员变量已经被初始化
静态成员变量
int Time::mystatic = 5; //可以给初始值,系统默认给0,定义时无需用static
//但是类名"Time::"要加
//调用
Time mytime;
mytime.mystatic = 12; //可以直接用对象名来引用静态成员变量
cout << Time::mystatic << endl;
cout << mytime.mystatic << endl;
静态成员函数
void Time::mstafunc(int testvalue)
{
//m_hour = testvalue; //错误,对象相关的成员函数不能出现在静态成员函数中
mystatic = testvalue; //静态成员变量可以
}
//调用
Time::mstafunc(123); //类名::静态成员函数名 调用
//也可以用对象名
Time mytime;
mytime.mstafunc(1234);
注意:静态成员函数中,不能调用非static成员函数,和非static数据成员