深入探索C++(const限定符的使用)

本人比较重视程序基础,最近课余的时间除了学习英语和项目外,都在看C++的书籍,前几个月把《C++数据结构》近900页的电子书基本啃完了,对数据结构和C++都做了一次系统的复习。最近在研究《C++ Primer》,虽说这本书意为《C++ 初级读本》,但涉及到的知识是比较广而深的,个人感觉没有一定的基础是很难领悟其中的精华的,阅读每一章节都让我受益匪浅,而且大部分的知识都是课堂上没有学到的,譬如位操作对象bitset和const限定符的各种用法:
const int ival = 10;   //int常量定义
const int* p = 0;     //指向int常量的指针(不能通过该指针修改指向的变量的值,例如*p=5;是非法的)
int ival2 = 50;
int* const q = &ival2;  //指向ival2的常指针(指针本身的值不能改变)
const int* const pq = 0; //指向常量的常指针
typedef int* pint;   //将pint定义为声明int*类型的别名
const pint pp = &ival2;   //相当于int* const pp = &ival2 而不是 const int* pp = &ival2; 这个地方不太好理解,强记

另外,号称C++程序员必看的一本著名的书《Effective c++》今天正式开始研究,本书主要讲叙一些用C++开发提高效率和避免错误等解决方案的一系列条款,我看的第三版(应该算是最新版了),共有55个条款,看了前两条就感觉看不下去了,第二个条款就是研究const,刚看到 a * b = c (a,b,c都为类类型),这样的语句时就懵了,还能给表达式赋值?!令人费解,不过坚持看下去,总算还是把这个怪异的东西吃透了:
class A
{
public:
   A(){};
   A& operater*(const A&);    //重载*号,返回A类型的对象引用
};

void main()
{
   A a, b, c;
   a * b = c;                        //将c赋值给a * c的返回值
}

经过编译证实以上的代码是正确的,结果是令人吃惊的,但根据以前学到文件流的时候对于这样的重载符的例子的经验,才猛然醒悟,这样确实是合法的。 (cout >> " " >> str >> endl;)
这就证实了为什么要在重载*这样的运算符时要在返回值前加上 const 限定符的最佳理由了,实在是高...
将       A& operater*(const A&);
改写为 const A& operater*(const A&);
然后
  A a, b, c;   a * b = c;                        //编译器报错,不能给常量赋值

以下为const限定函数参数

void Test(const int& ival);                  //该const修饰该参数的实参对应的变量的值不能被函数所修改

在类成员函数中的用法
class B
{
public:
    int void Test () const                   //该const标志该函数不能修改所在类中的成员
    {
        ival++;                               //非法:const限定函数不能修改类成员变量的值
        a++;                                 //合法:成员变量a被mutable关键字所修饰
        return ival;
    }

private:
    int ival;
    mutable int a;                      //mutable关键字标志该变量可被修改
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值