如何写出优质的C++代码:(一)const的使用

在程序中,const是使用频率较高的关键字,主要用来确保指针或其他变量不被随意修改。

将const放在变量前面,需将该变量进行初始化,并不可被修改:  

	const int iCount = 6;
    const char* p = "hello";
	iCount = 3;    //Error  不能给常量赋值
    p = "name";    //Error  不能给常量赋值

 也可以将const放在函数形参中,用于形参不可以被修改:

void f1(const Widget *pWin);    //pWin所指形参不可被修改

放在迭代器中:

	std::vector<int> vec;
	vec.push_back(5);
	const std::vector<int>::iterator ite = vec.begin();
	++ite;                //Error ite是const

我们也可以使用const来避免一些错误的编码形式,例如:为了防止出现以下形式的编码:

Persons p1,p2,p3;
...
(p1 + p2) = p3;    //暴力的代码

我们可以在类Persons中,对操作符“+”作如下声明:

const Persons operator+(const Persons* lhs,const Persons& rhs);

在类中,可以使用const修饰一个成员函数,说明该函数不可以改变类的内容:

class A
{
...
void f1() const;
};

我们也可以使用const来区分调用不同的类重载接口,看看下面这个类:

class ClassA
{
public:
	char& operator[](std::size_t pos) {
		return text[pos];
	}
	const char& operator[](std::size_t pos) const{
		return text[pos];
	}
private:
	std::string text = "niaoshu";
};

通过以下方式来调用:


	const ClassA A;
	std::cout << A[2] << std::endl;    //OK,输出:‘a’
    A[2] = 'k';                        //Error

	ClassA B;
	std::cout << B[2] << std::endl;    //OK,输出:‘a’
    B[2] = 'k';                        //OK

另外,我也可以使用const_cast去掉接口的const属性:

	const ClassA A;
	ClassA* pA = const_cast<ClassA*>(&A);
	(*pA)[2] = 'J';                        //OK
	std::cout << A[2] << std::endl;        //输出:'J'

当然,在实际的应用中,我们尽量谨慎使用const_cast,从某些角度讲,它降低了程序的安全性和稳定性。

未完待续!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值