Bootstrap

C++4:常引用&单目运算符++重载&const用法


前言

本章内容接着c++1~3,补齐lesson4的内容。


以下为正文,附案例参考。

1. 引用&(续)

1.1 问题提出(不能直接引用临时变量):

  • 在重载输出时,使用了临时对象的引用,出问题了:
Cmycomplex Cmycomplex::operator+(Cmycomplex z)
{//'+'运算符重载
	double tmpa = a + z.a;
	double tmpb = b + z.b;
	Cmycomplex tmpz(tmpa, tmpb);
	return tmpz;
}//注意此时返回值为“局部对象”
//--------------------------------------------------
ostream& operator << (ostream& mycout, Cmycomplex& z)
//mycout为形参名,它接收的值是ostream&类型的变量cout
//在重载<<输出时,使用了z的引用
{
	mycout<< '(' << z.a << '+' << z.b << "i)";
	return mycout;
}
//----------------------------------------------------
int main()
{
	Cmycomplex z1(1,2), z2(2,3);
	cout << z1 + z2;//采用重载'+'进行运算,重载的'<<'进行输出
	return 0;
}
  • 临时对象进行引用输出时产生错误:
  • 原因:
    临时对象的生存周期仅在该重载函数内部,出了该函数,对象无定义,因此无法进行引用,同时也防止有人想修改临时对象的值。所以现在的IDE基本在进行语法检查的时候就会标红or报错。

1.2 问题解决(不引用or常引用):

法1:

  • 遵循“最小特权原则”——只提供做这件事需要的最基本的功能。
  • 如上例引用输出出错,但是输出本身不需要改变值,因此直接传值就行,不引用。
ostream& operator << (ostream& mycout, Cmycomplex& z) //invalid
//改为:
ostream& operator << (ostream& mycout, Cmycomplex z)  //valid

法2:

  • 采用“常引用”——告诉IDE临时变量拿过来我不改变它,IDE就允许进行只读引用。
ostream& operator << (ostream& mycout, Cmycomplex& z) //invalid
//改为:
ostream& operator << (ostream& mycout, const Cmycomplex& z)  //valid
  • 好处:实现了只读引用,节省空间。

2. 单目运算符’- -'的重载

本小节的实例完整code可参考:C++:++ --运算符重载
以下按- -进行讲解,++类似。

2.1 前缀- -

//此例实现时间的--操作,对应整型类已有的相同操作
Cmytime &Cmytime::operator--()
{
	if (s == 0)
	{
		s = 59;
		if (m == 0)
		{
			m = 59;
			if (h == 0) h = 23;
			else h = h - 1;
		}
		else m = m - 1;
	}
	else s = s - 1;
	return *this;
	//------------返回值处取this内容,且返回引用-------------------------
}

上例包含知识点:

  1. 返回this指针所指对象的引用,即就是main()中要操作的对象

2.2 后缀- -

//此例实现时间的--操作,对应整型类已有的相同操作
Cmytime Cmytime::operator--(int)
{
	Cmytime tmp = *this;
	if (s == 0)
	{
		s = 59;
		if (m == 0)
		{
			m = 59;
			if (h == 0) h = 23;
			else h = h - 1;
		}
		else m = m - 1;
	}
	else s = s - 1;
	return tmp;
}
//tmp用于寄存原来的对象,局部对象不能做引用返回----------------------

上例包含知识点:

  1. 函数参数表中的(int)称为哑元,作用是用于区分前缀- -,没有编译意义但有语法意义
  2. tmp寄存this指向对象当前的值,将其进行非引用返回

3. 关于const

  • 实现常引用:对单个对象的只读引用
  • 限定成员函数:成员函数对成员变量进行只读,不能修改。例如:
void Cmycomplex::show() const
{
	cout << a << "+" << b << 'i' << endl;
}
  • 使用时注意:1.const必须限定成员函数,友元函数都不行;2.const关键字写在函数参数表之后。
  • 待补…
;