本期话题:字符串文字常量,指针,引用
1、关于字符串文字常量
sizeof("Bohr") == 5
字符串文字常量的类型是“适当个数的const字符的数组”,所以"Bohr"的类型就是const char[5]
下面的赋值是可以的:char* p = "Bohr";因为在C/C++原来的定义里,字符串文字常量的类型就是char*
字符串文字常量是静态分配的,他们被分配在程序的静态数据区,所以让函数返回字符串文字常量是安全的。
[code = c/c++]
const char* test()
{
// ...
return "test finish!"; // 正确,该字符串文字常量不会随函数的结束而销毁(因为它被分配在程序的静态数据区)。
}
[/code]
两个相同的字符串文字常量是否被分配在一起,取决于编译器实现。
[code = c/c++]
const char* p = "test";
const char* q = "test";
if (p == q) cont<<"one!/n"; // 结果随编译器而不同
[/code]
为使程序简洁,可以将长字符串分开书写,下面的书写方式也是正确的:
[code = c/c++]
char alpha[] = "abcdefgh"
"ijklmn";
[/code]
2、常量在定义时必须进行初始化
[code = c/c++]
const int num = 100; // ok
const int x; // wrong!
[/code]
3、常量指针和指针常量
[code = c/c++]
char* const cp; // 指向char的const指针
char const* cp; // 指向const char的指针
const char* cp; // 指向const char的指针
[/code]
可以这样理解:*代表指针,按照自右向左的顺序阅读。
cp is a const pointer to char
cp is a pointer to char const
cp is a pointer to const char
char const和const char是一样的。
4、不能将常量的地址赋给一个未加限制的指针
[code = c/c++]
const int c = 2;
int* pi = &c; // 错误:用const int* 来对int* 进行初始化
*pi = 3; // 这样,就造成来常量c的值可以被修改
[/code]
5、引用
引用的最明显的(也是最简单和最自然的)一种实现方式是作为一个常量指针,每次使用它的时候都自动做间接访问。所以:
[code = c/c++]
int ii = 0;
int& rr = ii;
rr++; // 是对ii加1,而不是将rr指向下一个位置
int* pp = &rr; // pp指向的是ii
[/code]
一些情况下,引用可以通过编译器的优化而去掉,使得在执行时根本不存在任何表示引用的东西。
引用在使用时必须初始化,对普通的T& 的初始式必须使用一个类型T的左值。左值是一个对象,可以取得它的地址。
[code = c/c++]
double& dr = 1; // 错误:要求左值
[/code]
但是,const T& 的初始式不必是左值
[code = c/c++]
const double& cdr = 1; // ok
[/code]
这相当于
[code = c/c++]
double temp = double(1); // 首先建立一个具有正确值的临时变量
const double& cdr = temp; // 用临时变量作为引用的初始式
[/code]