一、在类定义中实现成员函数inline:
类内的成员函数实现也叫做类内的成员函数定义,这种直接在类的定义中实现的成员函数,会被当做inline内联函数来处理。
二、成员函数末尾的const
const:常量,在成员函数屁股后面加一个const,不但要在成员函数的声明中增加const,也要在成员函数的定义中
增加const
作用:告诉系统,这个成员函数 不会修改该对象里任何成员变量的值等等。也就是说,这个成员函数不会修改类Time
的任何状态。
屁股后面加一个const后缀的成员函数**“常量成员函数”;**
const Time abc;//定义const对象。这种对象有限制。
abc.hour = 1000;不可以,const abc 不能被修改
结论:const成员函数,则不管是const对象,还是非const,都可以调用const成员函数。
而非const成员函数,不能够const对象调用,只能被非const对象调用。
三、mutable(不稳定,容易改变的意思)const的反义词。mutable的引入也正好是为了突破const的限制
用mutable修饰一个成员变量,一个成员变量一旦被mutable修饰,那么这个成员变量就可以被修改。
即便被const修饰下也可以被修改
四、返回自身对象的引用,this
如何理解这个this,咱们调用成员函数的时候,编译器负责把这个对象的地址(&mytime)传递给这个成员函数中
一个隐藏的this形参。
Time& Time::add_hour(Time *const this,int tmphour){}
在系统角度看来,任何对类成员的直接访问都被看做是通过this做隐式调用的。
clas Time{
public:
//把对象自己给返回去了
Time& add_hour(int tmphour);
Time& add_minute(int tmpminute);
};
Time& Time::add_hour(int tmphour)
{
hour += tmphour;
return *this;//把对象自己返回去了
}
Time& Time::add_minute(int minute)
{
this->minute += minute;//形参名和成员变量名相同,不得已要用this指针,否则用上面add_hour的方式。
return *this;
}
Time mytime;
mytime.add_hour(3);//mytime.add_hour(&mytime,3)
**a)this指针只能在成员函数中使用,全局函数,静态函数都不能使用this指针。
b)在 普通成员函数 中,this是一个指向非const对象的const指针(类型为Time,那么this就是Time *const this)
表示this只能指向当前Time对象,不能指向其他的
c)在 const成员函数 中,this指针就是一个指向const对象的const指针
(类型为Time,this就是const Time const this类型的指针);*
clas Time{
public:
//把对象自己给返回去了
Time& add_hour(int tmphour);
Time& add_minute(int tmpminute);
};
Time& Time::add_hour(int tmphour)
{
hour += tmphour;
return *this;//把对象自己返回去了
}
Time& Time::add_minute(int minute)
{
this->minute += minute;//形参名和成员变量名相同,不得已要用this指针,否则用上面add_hour的方式。
return *this;
}
Time mytime;
mytime.add_hour(3).add_hour(4).add_minute(5);//连调
五、static成员
有属于整个类的成员变量,这种成员变量就叫static成员变量。
特点:不属于某个对象,属于整个类,我们一旦在某个对象中修改了这个成员变量的值,在其他对象中直接能够看到的
修改信息。这种成员变量只有一个副本,对于这种成员变量的引用,我们用的是类名::成员变量名
成员函数前面也可以加static构成 静态成员函数。属于整个类的成员函数,调用时:类名::成员函名();
如何定义静态成员变量(分配内存)?
我们一般会在某一个**.cpp源文件的开头来定义这个静态成员变量**。这样就能够保证在调用任何函数之前这个静态成员变量已经成功初始化了
class Time//定义一个时间类 或类声明
{
public:
int hour;//小时
int minute;//分钟
int second = 0;//类内初始化
static int mystatic;//声明静态成员变量,还没有分配内存,所以也不能初始化。
static void mystafunc(int testvalue);//声明静态成员函数
};
void Time::mystafunc(int testvalue)
{
//minute = 12;//错误,因为minute成员变量是和对象相关的成员变量。
mystatic = 117;//可以,因为mystatic和类相关
}
static int g_abc = 15;//存储在静态存储区,被static修饰不能被其他文件读取。
int f_abc = 16;
//静态成员变量的定义初始化(分配内存)
int Time::mystatic = 15;//可以不给初值,那么系统默认给0,定义时不需要使用static
Time mytime1;
mytime1.minute = 15;
Time mytime2;
mytime2.minute = 30;
cout << mytime1.minute << endl;
cout << mytime2.minute << endl;
cout << Time::mystatic << endl;
Time::mystafunc(152);
cout << Time::mystatic << endl;
return 0;