目录
类的成员函数
成员函数是定义为类的一部分的函数, 有时也被称为方法( method ) 。 我们通常以一个类对象的名义来调用成员函数。
使用点运算符(.)来表达我们需要“某对象的某成员” 。点运算符只能用 于类类型的对象。其左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型 的一个成员名,运算结果为右侧运算对象指定的成员。
当用点运算符访问一个成员函数时,通常我们是想(效果也确实是)调用函数。我 们使用调用运算符(())来调用一个函数。调用运算符是一对圆括号,里面放置实参 (argwnent) 列表(可能为空)。
下面是调用成员函数示例
#include<iostream>
#include<string>
using namespace std;
class Time
{
public:
int hour;
int minute;
int seconds;
void Timeinit(int h, int m, int s)
{
hour = h;
minute = m;
seconds = s;
}
};
int main()
{
Time b;
b.Timeinit(11, 10, 20);
return 0;
}
const成员函数
把 const 关键字放在成员函数的参数列表之后,表示这个成员函数不会修改该对象里任何成员变量的值。像这样使用 const 的成员函数被称作常量成员函数
- const不仅在声明中,函数实现中也要带上。
- const成员函数无论是不是const对象都可以调用,而非const成员函数只能由非const对象调用,const对象不能调用
使用范例:
Time.h
class Time
{
public:
int minute;
int hour;
int second;
private:
int millisecond;
public:
Time(int tmphour, int tmpmin, int tmpsec);
Time(int tmphour, int tmpmin);
Time();
void addhour(int addh) const;
void non_const(){}
};
Time.cpp
void Time::addhour(int addh) const
{
//hour += addh;//错误不能修改成员变量的值
}
void func6()
{
const Time ct1(12, 12, 15);
Time t1(1, 1, 1);
ct1.non_const();//错误,const对象不能调用非const成员函数
t1.non_const();s
}
void non_m_func() const//错误,const只能修饰成员函数
{
}
可变数据成员(mutable)
有时,我们希望能修改类的某个数据成员,即使是在一个const成员函数内。可以通过在变量的声明中加入mutable关键字做到这一点。
一个可变数据成员(mutable data member)永远不会是const,即使它是const对象的成员。因此,一个const成员函数可以改变一个可变成员的值。
Time.h
class Time
{
public:
int minute;
int hour;
int second;
mutable int testvalue = 0;
public:
Time(int tmphour, int tmpmin, int tmpsec);
void testmutable() const;
};
Time.cpp
void Time::testmutable() const
{
testvalue += 10;
hour += 10;//错误,不能在const成员函数内修改非mutable成员变量
}
this
在调用成员函数时,编译器负责把该对象的地址传递给这个成员函数中的一个隐藏的this形参。在成员函数内部,任何对类成员的直接访问都被看 作this的隐式引用,也就是说this->meber(代表类成员)等价于meber(代表类成员)。
this指针只能在成员函数中使用,this是一个常量指针
在普通成员函数中,this是指向非const对象的const指针(类型为Time,那么this就是只能指向当前Time对象)
在const成员函数中,this指针是一个指向const对象的const指针(类型为Time,this就是const Time*const this类型的指针)
返回自身的引用
Time.h
class Time
{
public:
int minute;
int hour;
int second;
public:
Time(int tmphour, int tmpmin, int tmpsec);
Time& addmin(int tmpmin);
};
Time.cpp
Time& Time::addmin(int tmpmin)
{
minute += tmpmin;
return *this;
}
test.cpp
void func7()
{
Time t1;
t1.addmin(3);
}
通过调试我们可以看到对象t1的地址和传到成员函数addmin中的this的值是一样的。
另外如果形参和某个成员变量名字一致时,我们也可以使用this做出区分:
Time& Time::addsec(int second)
{
second = second;//两个都被当作形参,这句代码无作用
this->second = second;//正常赋值
return *this;
}
参考书籍:
C++ Primer中文版 第5版作 者: (美)李普曼(Lippman,S.B.),(美)拉乔伊(Lajoie,J.),(美)默(Moo,B.E.) 著 王刚,杨巨峰 译,出版社: 电子工业出版社,ISBN: 9787121155352
本文是学习过程中参照C++primer结合自己的理解所写的笔记,如有纰漏还请指出,谢谢