常量对象、常量成员函数和常引用

1.)常量对象

 如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字。

代码:

class Demo{
private:
	int value;
public:
	void SetValue(){  }
};

const Demo Obj;//常量对象,它的值不可修改

2.) 常量成员函数

1.在类的成员函数说明后面加上const关键字,则该成员函数为常量成员函数

2.常量成员函数执行期间不应该修改其作用的对象。因此,在常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员函数除外)。【之所以其不可调用成员变量和成员函数是因为,这两个会修改对象值。而静态的不会访问非静态的成员变量,故不会修改对象的值】

代码:

lass Sample
{
public:
	int value;
	void GetValue() const;//常量成员函数
	void func(){};
	Sample();
};
void Sample::GetValue() const
{
	value=0;//wrong
	func();//wrong
}

int main()
{
   const Sample o;//定义常量对象
   o.value=100;//wrong,常量对象不可被修改
   o.func();//wrong,常量对象不可以执行非常量成员对象
   o.GetValue();//ok,常量对象可以执行常量成员函数
   return 0;
}

3.成员函数的重载 两个成员函数,名字和参数都一样,但是有一个是const,一个不是,算重载,而不是重复定义。

代码:

//常量成员函数的重载
#include<iostream>
using namespace std;
class CTest{
  private:
  	int n;
  public:
  	CTest(){n=1;}
  	int GetValue() const {return n;}//常量成员函数
  	int GetValue() {return 2*n;}//普通成员函数
};
int main()
{
	const CTest objTest1;//调用常量成员函数
	CTest objTest2;//调用普通成员函数
	cout<<objTest1.GetValue()<<","<<objTest2.GetValue()<<endl;
	return 0;
}

结果:

1,2

3.) 常引用

引用前面加const关键字,成为常引用。不能通过常引用,修改其引用的变量

代码:

const int & r=n;
r=5;//error
n=4;//ok

对象作为函数参数时,成该参数需要调用复制构造函数,效率比较低。用指针做参数又不好看,此时可以用对象的引用做参数。

代码:

class Sample{
......
};


void PrintObj(Sample & s)//对象的引用做参数,省时
{
......
}

可是对象引用作为参数有风险,如果函数中不小心修改了形参对象,则实参也会改变。改进方法:常引用

class Sample{
......
};

void PrintfObj(const Sample & s)//这里与上面例子有差别,该函数内,不可通过常引用修改s的值,也就不会修改实参对象的值。
{
......
}
发布了30 篇原创文章 · 获赞 6 · 访问量 996

猜你喜欢

转载自blog.csdn.net/weixin_43677405/article/details/100060348