本人比较重视程序基础,最近课余的时间除了学习英语和项目外,都在看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 限定符的最佳理由了,实在是高...![](https://i-blog.csdnimg.cn/blog_migrate/e8c4750091f3eee9a71aad38b77707d0.gif)
将
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关键字标志该变量可被修改
}
const int ival = 10;
const int* p = 0;
int ival2 = 50;
int* const q = &ival2;
const int* const pq = 0;
typedef int* pint;
const pint pp = &ival2;
另外,号称C++程序员必看的一本著名的书《Effective c++》今天正式开始研究,本书主要讲叙一些用C++开发提高效率和避免错误等解决方案的一系列条款,我看的第三版(应该算是最新版了),共有55个条款,看了前两条就感觉看不下去了,第二个条款就是研究const,刚看到 a * b = c
class A
{
public:
A(){};
A& operater*(const A&);
};
void main()
{
A a, b, c;
a * b = c;
}
经过编译证实以上的代码是正确的,结果是令人吃惊的,但根据以前学到文件流的时候对于这样的重载符的例子的经验,才猛然醒悟,这样确实是合法的。 (cout >> " " >> str >> endl;)
这就证实了为什么要在重载*这样的运算符时要在返回值前加上 const 限定符的最佳理由了,实在是高...
![](https://i-blog.csdnimg.cn/blog_migrate/e8c4750091f3eee9a71aad38b77707d0.gif)
将
改写为
然后
A a, b, c;
以下为const限定函数参数
void Test(const int& ival);
在类成员函数中的用法
class B
{
public:
int void Test () const
{
ival++;
a++;
return ival;
}
private:
int ival;
mutable int a;
}
![](https://i-blog.csdnimg.cn/blog_migrate/5a23052a871149843d8fe34672e1bd7a.gif)