总论:
默认函数返回不允许用作左操作数;
C++确实强类型,编译器不是容易被欺骗的,哈哈,常量对象调用常量成员函数,不能改变其值;
将返回值,变量,成员函数,声明为const可以帮助编译器查找应用错误;
编译器是bitwise的constness,我们应该知晓logistic constness,应用mutable来处理变量;
当const与non-const函数内容几近一样时,可以在non-const函数中调用const函数。
C++中的static对象是指存储区不属于stack和heap、"寿命"从被构造出来直至程序结束为止的对象。这些对象包括全局对象,定义于namespace作用域的对象,在class、function以及file作用域中被声明为static的对象。其中,函数内的static对象称为local static 对象,而其它static对象称为non-local static对象。
初始化内建类型;
尽量应用初始化列表,而不用赋值初始化
避免初始化顺序的影响,应用local static而不用non-local static
//head file
class GamePlayer
{
private:
//static const double NumTurns = 5.88; //only static const int variant is allowed in-class initialization
const int NumTurns;
//int scores[NumTurns];
public:
void Display();
GamePlayer(int num):NumTurns(num) {}
};
//implement file
int globenum = 100;
#include <iostream>
#include "GamePlayer.h"
using std::cout;
using std::endl;
//const double GamePlayer::NumTurns = 5.99;
void GamePlayer::Display()
{
cout << NumTurns << endl;
}
int main()
{
int globenum = 1;
GamePlayer player1(10);
player1.Display();
cout << ::globenum;
}
item 3
//header file
class TextBlock
{
public:
// const char& operator [](std::size_t pos) const
char& operator [](std::size_t pos) const
{
return text[pos];
}
char & operator [](std::size_t pos)
{
return text[pos];
}
// TextBlock(std::string str):text(str)
TextBlock(char * ctext):text(ctext)
{}
private:
//std::string text; // 对于c++ 类型,如果对常量对象调用 operator[ ]函数则返回类型必须为 const,这是强类型所表现;但是对于c内建类型,返回值可以没有const,从而增加了可以通过指针修改const数据类型的风险,所以鼓励应用c++内建类型的表现也在/于此!
char * text; //应用此类型就可以对const的operator返回非const类型。 另:指针的操作效率是没有数组高的,可以看其汇编
};
//implement file
#include <iostream>
#include "GamePlayer.h"
using std::cout;
using std::endl;
void print(const TextBlock &ctb)
{
std::cout << ctb[0];
}
void main()
{
const TextBlock ctb("persist");
TextBlock tb("perseverance");
print(ctb);
print(tb);
char *p = &ctb[0];
*p = 'a';
//ctb[0] = 'a';
print(ctb);
}