Effective C++ 读书笔记 条款03:尽可能使用const

Core List

1.  const 修饰指针变量

char *name = "Boxi"; //非常量指针,非常量变量

const char* name = "Boxi"; //非常量指针,常量变量

char const* name = "Boxi"; //非常量指针,常量变量(同上1等价)

char* const name = "Boxi"; //常量指针,非常量变量

const char* const name = "Boxi"; //常量指针,常量变量


2. const 修饰迭代器

(1) const vector<int>::iterator it = vec.begin();  //常量指针,非常量变量【T* const】

     *iter = 10; //【正确】可以修改指针指向地址内的数据

      iter++;     //【错误】不可修改指针指向的地址

(2) vector<int>::const_iterator it = vec.begin(); //非常量指针,常量变量【const T*】

     *iter = 10; //【错误】不可以修改指针指向地址内的数据

      iter++;     //【正确】可修改指针指向的地址


3. const 修饰函数

(1) 修饰返回值

const Fun (const int &a, const int& b); // 避免返回值被重新误赋值

(2) 修饰参数

const Fun (const int &a, const int& b); // 避免函数内部修改变量

(3) 修饰成员函数【目的:操作 const 对象】

class Man {

pubilic:

    const char& operate[] (unsigned int index) const

    { return text[index]; } // const 对象调用此函数

    char& operate[] (unsigned int index)

    { return text[index]; } // 非 const 对象调用此函数

private:

    std::string text;

}

例:

const Man cm("Boxi"); //cm为const类型

cout<<cm[0]<<; //【正确】读一个const类型对象

cm[0] = 'x; //【错误】写一个const类型对象


Man m("Boxi"); //m为非const类型

cout<<m[0]<<; //【正确】读一个非const类型对象

m[0] = 'x'; //【正确】写一个const类型对象

注:如果返回的是char 而非 &char,则m[0]='x'不合法,其赋值的是m.text[0]的一个副本【函数返回值是内置对象,则函数返回值不可被修改】


4. bitwise constness 和 logical constness

bitwise constness :不更改对象内的任何一个bit

logical constness :可以修改它锁处理的对象内某些 bit, 但只有在客户端侦测不出的情况。

注:bitwise constness 问题 【满足bitwise constness测试,但值被修改】

对象包含的成员是指针,指针所指向的地址中的变量改变了。

注:取消 bitwise constness 约束 【使用 mutable 修改变量】


5. const 和 non-const 成员函数中避免代码重复

(1) const 内部调用 non-const 【错误】(non-const 可修改对象内部变量,其不能包含在const内部)

(2) non-const 内部调用 const 【正确】(两次类型转换)

const char& operate[] (unsigned int index) {}

char& operate[] (unsigned int index) {

    return const_cast<char&>(static_cast<const TextBlock&>(*this) [index])

}

注:

static_cast :将non-const 转化为 const

const_cast :将返回值移除const






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值