条款20(避免public出现数据成员)、条款21(尽量用const)"/>
读书笔记:Effective C++ 2.0 版,条款20(避免public出现数据成员)、条款21(尽量用const)
条款20: 避免public接口出现数据成员
三个原因:
接口一致性:统一范式的get set,避免混合。
接口无歧义:精确控制数据成员的get、set。
功能分离(functional abstraction):接口一致,数据成员可换。
class accesslevels {
public:int getreadonly() const{ return readonly; }void setreadwrite(int value) { readwrite = value; }int getreadwrite() const { return readwrite; }void setwriteonly(int value) { writeonly = value; }
private:int noaccess; // 禁止访问这个intint readonly; // 可以只读这个intint readwrite; // 可以读/写这个intint writeonly; // 可以只写这个int
};
条款21: 尽可能使用const
语义明确,方便编译器优化,方便用户理解使用接口。
const从右往左进行修饰,或者以*为分界线看。
char *p = "hello"; // 非const指针,// 非const数据
const char *p = "hello"; // 非const指针,// const数据
char const *p = "hello"; // 同上,更标准的写法。
char * const p = "hello"; // const指针,// 非const数据
const char * const p = "hello"; // const指针,// const数据
char const * const p = "hello"; // 同上,更标准的写法。
用const对函数返回值进行修饰,以下为定义范式
const rational operator*(const rational& lhs,const rational& rhs);
rational a, b, c;
(a * b) = c; // 对a*b的结果赋值
const成员函数的目的当然是为了指明哪个成员函数可以在const对象上被调用。
仅在const方面有不同的成员函数可以重载,这是c++的一个重要特性。
以下为定义范式:
class string {
public:...// 用于非const对象的operator[]char& operator[](int position){ return data[position]; }// 用于const对象的operator[]const char& operator[](int position) const{ return data[position]; }
private:char *data;
};
更多推荐
读书笔记:Effective C++ 2.0 版,条款20(避免public出现数据成员)、条款21(尽量用const)
发布评论