条款03:尽可能使用const

  const指定不能被改动的对象,编译器会强制实施这项约束。

char name[] = "April"
const  char  *p = name;           //常量数据,非常量指针
char*  const  p = name;           //非常量数据,常量指针

 

#include <vector>
using namespace std;

int main(){

    vector<int> vec;
    vec.push_back(0);

    const vector<int>::iterator iter = vec.begin();    //等价于int* const iter; 常量指针
    *iter = 10;                                       //可以改变存储的数据

    vector<int>::const_iterator cIter = vec.begin();   //等价于const int* iter;  常量数据
    ++cIter;                                           //可以改变指针的指向

    system("pause");
    return 0;
}

const返回值

    函数返回常量值,可以避免用户修改造成意外,如操作符*返回常量值,语句(a * b)= c就会编译不通过。

const Number operator* (const Number& lhs, const Number& rhs);

const成员函数

     const成员函数,可以使用于const对象。优点:

  1. 使class成员函数容易理解,明确哪个成员函数可以改动对象;
  2. 两个成员函数如果只是常量性不同,可以被重载。
#include <iostream>
#include <string>
using namespace std;

class Test{
public:
    Test(string name):m_name(name){}
    const char& operator[](int pos) const {  return m_name[pos]; };
    char &operator[](int pos){ return m_name[pos]; };
private:
    string m_name;
};

int main(){

    Test myTest("Hello");
    cout << myTest[0];

    const Test CmyTest("April");
    cout << CmyTest[0];

    system("pause");
    return 0;
}

    注:函数的返回类型是char的引用而不是char,因为如果函数的返回类型是内置类型,那么改动返回值就不合法。

常量性移除

    mutable,在const成员函数内,可以更改mutable声明的成员变量。

class Test{
public:
    const char& operator[](int pos) const {  return m_name[pos]; };
    char& operator[](int pos)
    { 
        return const_cast<char&>(static_cast<const Test&>(*this)[pos]); 
    };
private:
    string m_name;
};

    注:上述代码里有两次转型操作。第一次为*this加上const,调用const operator[]。第二次是将 operator[]返回值的const移除。这样的调用避免了代码的重复。另外一种避免代码重复的方法是:将公共代码移至另外一个 private成员函数里,供函数调用。

总结:

  1. const可用于任何作用域内的对象、函数参数、函数返回类型、成员函数本身,声明为const可帮助编译器侦测出错误用法。
  2. 编译器强制实施bitwise constness ,但编写程序时应该使用”概念上的常量性”(conceptual constness);
  3. 当const和non-const成员函数实质上等价时,令non-const版本调用const版本可避免代码重复。


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值