03_03_常量成员函数、mutable、this指针

prohect03.cpp

#include <iostream>
#include "Time.h"

using namespace std;

//普通函数,后面加onst是编译错误的。需要在成员函数后面加const(即类的成员函数)
//因为const放在成员函数后,表示不能修改该对象的成员变量
//void ptfunc() const 
//{
//	return ;
//}

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

int main()
{
	//二:成员函数末尾的const
	//const:常量,在成员函数末尾增加一个const。不但要在成员函数声明中增加const, 也要在成员函数定义中增加const
	//作用:告诉系统,这个成员函数,不会修改该对象里任何成员变量的值等等。也就是说,这个成员函数不会修改类Time的任何状态
	//末尾加一个const后缀的成员函数 “常量成员函数”
	const Time abc;
	Time def;
 
	//abc.addMinute(200); 不可以,addMinute()不是const成员函数,这个addMinute()只能被非const对象调用
    def.addMinute(1500);
	def.addHour(1);
	//const成员函数,则不管是const对象,还是非const,都可以调用const成员函数
	//而非const成员函数,不能够别const对象调用,只能被非const对象调用

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

	//四:返回自身对象的引用,this
	//如何理解这个this, 我们调用成员函数时,编译器负责把这个对象的地址(&myTime)传递给这个成员函数中一个隐藏的this形参。
	//在系统角度看来,任何对类成员的直接访问都被看做是通过this做隐式调用的

	//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类型的指针)


	//五:static成员
	//有属于整个类的成员变量,这种成员变量就叫static成员变量(静态成员变量)
	//特点:不属于某个对象,属于整个类,我们一旦在某个对象中修改了这个成员变量的值,在其他对象中直接能看到该后的结果。
	//这种成员变量只有一个副本,对于这种成员变量的引用,我们用的是类名::成员变量名
	//成员函数前面也可以加stataic构成 静态成员变量,属于整个类的成员函数。调用时: 类名::成员函数名

   Time myTime;
   myTime.add_hour(3);//myTime.add_hour(&myTime.3);



   return 0;
}


Time.h

#include<iostream>

class Tmpclass
{
public:
	Tmpclass()
	{
		std::cout<<"调用了Tmpclass的构造函数"<<std::endl;
	}

	Tmpclass(Tmpclass &tmpclass)
	{
		std::cout<<"调用了Tmpclass类的拷贝构造函数"<<std::endl;
	}
};



class Time
{
public:
	Time();
	explicit Time(int tmphour);
	Time(int tmphour,int tmpmin);
	explicit Time(int tmphour,int tmpmin, int tmpsec);	 

	//拷贝构造函数
	Time(const Time &tmptime,int a=56);

	Time &operator=(const Time&);//重载的赋值运算符

	void addHour(int tmpHour) const;
	void addMinute(int tmpMinute);

	Time& add_hour(int tmpHour);
	
	static int mystatic;//声明静态成员变量,还没有分配内存,所以也不能在这里初始化
	static void mstafunc(int testvalue);

	int Hour;
	int Minute;	
	int Second;

	Tmpclass c1;

};

Time.cpp

#include "Time.h"
#include <iostream>

//拷贝构造函数
Time::Time(const Time &tmptime,int a)
{
	std::cout<<"调用了Time::Time(const Time &tmptime,int a)拷贝构造函数"<<std::endl;
}

Time::Time()
{
	std::cout<<"调用了Time::Time()构造函数"<<std::endl;
}

void Time::addHour(int tmpHour) const
{
	// this->Hour+=tmpHour;  这句话就会报错,不能修改对象的值
}

void Time::addMinute(int tmpMinute)
{
	this->Minute+=tmpMinute;
}

Time& Time::add_hour(int tmpHour)
{
	Hour+=tmpHour;  //this->Hour+=tmpHpur;
	return *this;   //把对象自己给返回去了
}


//Time& Time::add_hour(Time *const this,int tmpHour)
//{
//   
//}

//静态函数只能包含静态的成员变量
//非静态函数可以包含静态或非静态的成员变量
void Time::mstafunc(int testvalue)
{
	//Minute=20;//错误,因为Minute成员变量和对象相关的成员变量
	mystatic=17; //可以,因为mystati和类相关
}


//赋值运算符重载
Time& Time::operator=(const Time& tmpobj)
{
	this->Hour=tmpobj.Hour;
	this->Minute=tmpobj.Minute;
	this->Second=tmpobj.Second;
	std::cout<<"调用了 Time& Time::operator=(const Time& tmpobj)赋值运算符重载"<<std::endl;
	return *this; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lz_煜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值