您的位置:首页 > 编程语言 > C语言/C++

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

2008-03-08 01:12 330 查看
作者:欣恒 http://user.qzone.qq.com/9292492 http://user.qzone.qq.com/9292492/blog/1204908820
本人比较重视程序基础,最近课余的时间除了学习英语和项目外,都在看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关键字标志该变量可被修改
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: