Effective C++ item 2&3

条款2,3:使用const

1. const 和 pointer

char p[] = {"1233"};
const char* ptr = p;
const char* str = "awk";

字符串的存储位置

其中str指向字符串常量,存储在代码段,ptr指向数据段。const 修饰不能通过指针修改所指之物。但是指针的指向可以修改。

char s[] ={"5678"};
ptr = s; //上述指针指向s

同时使用const修饰指针和所指向之物时:

const char * const ppt = s;

2. const 和 class

class Exa{
	public:
	//...构造析构
	const char& operator[](std::size_t pos) const{
		...  //运算
		return arr[pos];
	}
	char &operator[](std::size_t pos){
		...  //运算
		return arr[pos];
	}
	char &operator[](std::size_t pos) const{
		...  //运算
		return arr[pos];
	}
	private:
	const int SIZE = 100;
	char *arr;
};

const与non-const会构成重载,第一个operator[]中的const是限制函数不可修改成员并且不可修改返回值,第二个未进行const限制,第三个const限制不能再函数中修改成员,但是它返回的引用会在函数外部进行对函数内部的修改,相当于自己将成员的内部暴露在外,所以一般不应用这样的修改方式。

class Exa{
	public:
	//...构造析构
	const char& operator[](std::size_t pos) const{
		...  //运算
		return arr[pos];
	}
	char &operator[](std::size_t pos){
		return const_cast<char &>(static_cast<const Exa&>(*this)[pos]);
		
	}
	private:
	const int SIZE = 100;
	char *arr;
};

所以如上,一般只保留前两种的[]的重载,但是这个重载在功能上的重复太多,有一点代码膨胀的嫌疑,所以将第二个非const的重载中将const移除。解释:添加const的转型使用static_cast<>进行了一次安全转型(将non-const对象转换为const对象),使用const_cast<>进行了一次移除const的操作。
const不仅可以作用于成员方法,也能作为成员对象,SIZE,给定初值,构造时使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值