读书笔记: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;             // 禁止访问这个int
  int readonly;             // 可以只读这个int
  int readwrite;            // 可以读/写这个int
  int 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;
};

你可能感兴趣的:(cpp,c++)