c++知识细节-inline/成员函数末尾的const/mutable/this/static

c++知识细节-inline/成员函数末尾的const/mutable/this/static

inline

类定义中定义并实现的成员函数,会被当做inline内联函数来处理。

  • 这种写法仅是开发者的建议,是否成功内联取决于编译器,所以函数体应尽量简单。
  • 被多次include也不会报函数重定义。

成员函数末尾的const

在成员函数屁股后边加一个const。不但要在成员函数声明中加const,也要在成员函数定义中增加const。类定义中定义并实现的成员函数后面加const也会有一样的效果。

作用: 这个成员函数不会修改任何成员变量的值,也被称为“常量成员函数”

  • 不管是const对象还是非const对象,都可以调用const成员函数;而非const成员函数,不能被const对象调用。
  • 普通函数末尾不能放const,因为其压根没有成员和类的概念。

mutable

不稳定,容易改变,const的反义词。mutable的引用也正是为了突破const的限制。
一个成员变量一旦用mutable修饰了,就表示这个成员变量永远处于可以被修改的状态,即便是在const结尾的成员函数中,也可以修改。

返回对象自身的引用,this

对this的理解:咱们调用成员函数时,编译器负责把这个对象的地址(&myTime)传递给了这个成员函数中的一个隐藏的this形参。
Time& Time::add_hour(int tmphour) -> Time& Time::add_hour(Time *this, int tmphour)
调用时:
myTime5.add_hour(3); -> myTime5.add_hour(&myTime5,3);
在系统看来,任何对类成员的直接访问都可以被看做是通过this做隐式调用的。

  • this指针只能在成员函数中使用,全局函数以及静态函数都不能使用this指针。
  • 在普通成员函数中,this是一个指向非const对象的const指针,Time *const this表示this只能指向当前对象。
  • 在const成员函数中,this指针是一个指向const对象的const指针,const Time *const this.第一个const指对象内部内容不能修改,第二个const指这个指针只能指向这个对象。

static成员

  • 回顾c语言局部静态变量:
static g_abc = 15;	//全局静态变量,系统自动给一个初始值0,存储在静态存储区
//此时其他cpp文件中不能使用此静态全局变量。
//而普通全局变量 g_abc = 15,其他cpp文件只需要 extern int abc;即可使用。

void func()
{
	static int abc = 5;	//局部静态变量
	abc = 8;
}

局部静态变量只初始化一次,第二次调用func时,abc就已经是8了。

  • static成员
Time myTime1;
myTime1.Minute = 15;

Time myTime2;
myTime2.Minute = 30;
//此时这两个对象的Minute变量互不影响。

(1) 有属于整个类的成员变量,这种成员变量属于整个类。我们一旦在某个对象中修改了这个成员变量的值,在其他对象中直接能看到修改的结果。
(2) 这种成员变量只有一个副本,对于这种成员变量的引用,我们使用类名::成员变量名。
(3) 成员函数前面也可以加static来构成静态成员函数,属于整个类的成员函数。调用时使用类名::成员函数名。
(4) .h文件中声明静态成员变量后,还没有分配内存,也不能初始化使用,需要在某一个cpp文件开头来定义这个静态成员变量,定义在开头的目的是保证在调用任何函数之前这个成员变量就已经初始化了。
(5) 不能在静态成员函数中修改某普通成员变量的值,因为普通成员变量是和对象相关的。只能修改类相关的静态成员变量。

//Time.h

class Time
{
private :
	int Millsecond;	//毫秒
	//私有函数
	void initMillTime(int mls);
public:
	int Hour;	//小时
	int Minute; //分钟
	int Second; //秒钟	
	
	mutable int testvalue;
	//成员函数
	void initMytime(int tHour, int tMin, int tSec);

	static int mystatic;	//声明静态成员变量,还没有分配内存,不能在这里初始化,需要定义后使用
	//需要在某一个cpp文件开头来定义这个静态成员变量
public:
	//构造函数
	explicit Time(int tHour, int tMin, int tSec=30)Time(int tHour);	//	一个参数
	Time();	//	不加参数
}
public:
	//把对象自己返回去
	Time& add_hour(int tmphour);
	Time& add_minute(int Minute)void addHour(int tmpHour)
	{
		Hour += tmoHour;
	}
	void delHour(int tmpHour) const;
	void noone() const
	{
		testvalue = 15;		//mutable修饰,可被修改
	}

//Time.cpp

#include <Time.h>
Time::Time(int tHour, int tMin, int tSec)
{
	Hour = tHour;
	Minute = tMin;
	Second = tSec;
	
	initMillTime(0);
}
Time::Time()
{
	Hour = 12;
	Minute = 59;
	Second = 59;
	
	initMillTime(0);
}
void Time::initMytime(int tHour, int tMin, int tSec)
{
	Hour = tHour;
	Minute = tMin;
	Second = tSec;

	//不暴露给外部使用者,但是成员函数内部可以调用私有成员函数
	initMillTime(0);
}
void Time::initMillTime(int mls)
{
	Millsecond = mls;
}
Time& Time::add_hour(int tmphour)
{
	Hour += tmphour;
	return *this;
}
Time& Time::add_minute(int Minute)
{
	this->Minute+= Minute;
	return *this;
}

void Time::delHour(int tmpHour) const
{

}

main.cpp

#include <Time.h>
void func1(Time myt)
{
}

//定义静态成员变量(分配内存)
static	int Time::mystatic = 15;	//可以不给初值,系统默认给0,定义时不需要使用static

void main 
{
	Time myTime = Time(12.12.54);
	Time myTime2(12,12,43);
	Time myTime3 = Time{12,13,43};
	Time myTime4{12,12,34};
	//Time myTime5 = {12,14,54};	//进行了隐式类型转换,若声明带有explicit,会报错

	const Time abc;
	abc.initMytime(1,2,3);	//不可以,因为initMytime()并不是const成员函数,其只能被非const对象调用

	Time myTime5;
	myTime5.add_hour(3).add_minute(4);	//连续调用

	cout << Time::mystatic;	//15

	Time myTime6;
	myTime6.mystatic = 88;
	cout << Time::mystatic;	//88
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值