const、this、static
const、this、static的熟悉
一、成员函数末尾的 const
对于成员函数的声明和实现代码分开的情形下,不仅要在成员函数的声明中添加 const,也要在成员函数实现中添加 const。
而 const 会靠苏系统,这个成员函数不会修改该对象内的任何成员变量的值。即不会修改类对象的任何状态。
以下是声明函数的错误例子。
void noone() const{
Hour += 10; //错误,常量成员函数不可以修改成员变量的值
}
以下是函数实现的错误例子。
const Time abc;
abc.addhour(12); //不可以,addhour 成员函数是非 const 的,只能被非 const 对象调用。
abc.noone(); //可以,因为 noone 成员函数是 const的
Time def;
def.noone(); //均可以调用 const
非成员函数末尾是不能加 const 的。因为 const 在函数末尾的定义是:“成员函数不会修改该对象内所有成员变量的值”。
二、返回自身对象的引用——this
在 Time 类定义中添加如下声明:
public:
Time& rtnhour(int tmphour); //返回自身的引用
在函数实现中添加如下:
Time& Time::rtnhour(int tmphour){
Hour += tmphour;
return *this; //把对象自身返回了
}
在 main 函数中添加如下:
Time mytime;
mytime.rtnhour(3);
这里要重新理解 this 了。
this 用在成员函数中是一个隐藏起来的函数参数,表示的是指向本对象的指针。调用成员函数时,编译器负责把调用这个成员函数的对象的地址传递给这个成员函数中一个隐藏的 this 形参中。
Time& Time:: rtnhour(Time * const this, int tmphour){}
而调用的时候:mytime.rtnhour(&mytime,3);
成员函数体中可以直接使用类对象的成员变量,因为任何对类成员的直接访问都被看做通过 this 做隐式调用。
那么函数体内Hour += tmphour;
等价于this->Hour += tmphour;
。
有几个 this 的注意点:
- this 是系统保留字。
- this 是一个指针常量。
- this 指针只能在成员函数中使用。
- 在普通成员函数中,this 是一个指向非 const 对象的指针常量。// 类类型为Time,那么 this 就是 Time * const类型的指针,this 只能指向 Time对象。
- 在 const 成员函数中,this 指针是一个指向 const 对象的 const 指针。// 类类型为Time,那么 this 就是 const Time * const类型。
倘若再写一个类似 rtnhour 这样的函数,则两个函数都能串起来调用。
例如,mytime.rtnhour(3).rtnminute(10);
三、static 成员
先看下面2个无参构造的实例化:
Time mytime1;
mytime1.Minute=15;
Time mytime2;
mytime2.Minute=30;
进行调试后,发现两个不同对象的成员变量 Minute 有不同的值,彼此互不影响。因为成员变量是属于对象的。不同的对象占用不同的内存地址。
但是存在一种成员变量并不属于某个对象,而是属于整个类。该成员变量就叫 static 成员变量。