条款03:尽可能使用const

条款03:尽可能使用const(Use const whenever possible)

内容:
    const关键字可以允许你指定一个对象是不能被改变的,而编译器能为你执行这个语义的约束,
来确保代码中试图修改该对象的代码不能编译通过,以前我很少用const关键词,觉得用不用都可以,
对它了解的很少,但随着写代码的增多,我越来越觉得const关键词很实用,很多地方用它可以达到一
些意想不到的好处.
    不要认为const关键词用法用多么的复杂,实际上它仅仅表示对于其所修饰的对象或者函数是不
能改变其值的,请看下面代码:
    const char* pString="Hello World";  //pString所指向字串是不能被修改的,但是pString的值可以被修改
    char* const pStringA="Hello World Too!";//pStringA的值不能被修改,即pStringA不能被指向其它字串,而pStringA
                                    //所指向的字串可以被修改,即*pStringA='I';是合法的.
    const char* const pStringB="Hello World End!";//pStringB的值及所指向的字串都是不能被修改.
   
    const最具威力的用法是对函数声明的应用,在一个函数声明式里,const可以和函数返回值、参数
、函数自身(成员函数)产生关联,比如另函数返回常量值往往可以避免因客户的错误造成的意外而又不
放弃安全性和高效性.书上举的一个例子:
    class Rational{...};
    const Rational operator*(const Rational& lhs,const Rational&rhs);
    为什么这里返回值要加个const呢?不加不也行吗?好,我们来看客户怎么用它,对于客户来说,他完全
有可能写出如下代码:
    Rational a,b,c;
    (a*b)=c;//这样写肯定是不合理的,我们应该避免,如何避免?这里的const就提供了这样的保证
    这里const Rational返回值表示a*b的结果值是不能被改变的,而上述代码显然编译不能通过,现在知
道它的好处了吧?呵呵!好,我们接下来继续聊.
   
    现在你应该对const关键字修饰对象表示的含义有个大体的了解了吧?那么我们再来看const修饰
类成员函数的问题,这里书上提出"如果一个类成员函数实现体内没有改变该类的成员函数,请将该函数加const来修饰",
为什么要这样做呢?举个例子:
    class MusicItem
    {
    public:
        MusicItem(const string& name,...):name_(name),...{
        }
        ...
        string getName()const{
            return name_;
        }
        string getName(){
            return name_;
        }
    private:
        ...
        string name_;       
    };
    接下来代码中需要测试这个类,测试一:  
    //test.cpp
    const MusicItem item("Honey,I'm home!");
    string musicItemName=item.getName(); //OK! call const function.
    MusicItem newItem("Party for two");
    string newMusicItemName=newItem.getName();//OK! call non-const function
   
    我们再次进行测试二:
    //string getName()const{
    //    return name_;
    //}
    这里我们注释掉了const member function;
    我们再次编译test.cpp文件,会得到什么结果呢?
    const MusicItem item("Honey,I'm home!");
    string musicItemName=item.getName(); //error! can't find appropriate function signature with "const" keywords
    MusicItem newItem("Party for two");
    string newMusicItemName=newItem.getName();//OK! call non-const function
   
    我们先不分析原因,继续测试三:
    在测试一的基础上我们注释掉non-const member function;
    //string getName(){
    //    return name_;
    //}
    我们再次编译test.cpp,有会出现什么问题呢?
    const MusicItem item("Honey,I'm home!");
    string musicItemName=item.getName(); //OK! call const function
    MusicItem newItem("Party for two");
    string newMusicItemName=newItem.getName();//OK! call const function
    经过这三个测试我们会的出什么结论呢?我觉得,我们至少可以知道:
    (1).用const修饰成员函数签名,主要是为了考虑能够方便为const类对象能够提供调用.如果我
    们的成员函数中没有一个带const签名,那么这个类的const对象将不能调用它的任何成员函数.
    (2).const类对象只能调用const修饰的类成员函数.
    (3).当const与non-const类成员函数同时出现的时候,non-const成员对象优先调用non-const成
    员函数,如果没有non-const成员函数时,它就会调用const成员函数.
    现在你应该知道为什么最好要在一些不修改成员变量的类成员函数加const关键词了吧?呵呵!
   
    请记住:
    ■ 将某些东西声明为const可帮助编译器侦测出错误用法.const可被施加与任何作用域内的对象、
函数参数、函数返回类型、成员函数本题.
    ■ 编译器强制实施bitwise constness,但你编写程序时应该使用"概念上的常量性"(conceptual
constness).
    ■ 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免
代码重复.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值