char *str = GetString();//cannot convert from 'const char *' to 'char *';
正确的用法是:
const char *str = GetString();
b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时
的存储单元中,加
const 修饰没有任何价值。如不要把函数 int GetInt(void) 写成 const int
GetInt(void)。
3>const 成员函数的声明中,const 关键字只能放在函数声明的尾部,表示该类成员
不修改对象
.
说明:
const type m; //修饰 m 为不可改变
示例:
typedef char * pStr; //新的类型 pStr;
char string[4] = "abc";
const char *p1 = string;
p1++; //正确,上边修饰的是*p1,p1 可变
const pStr p2 = string;
p2++; //错误,上边修饰的是 p2,p2 不可变,*p2 可变
同理,
const 修饰指针时用此原则判断就不会混淆了。
const int *value; //*value 不可变,value 可变
int* const value; //value 不可变,*value 可变
const (int *) value; //(int *)是一种 type,value 不可变,*value 可变
// 逻 辑 上 这 样 理 解 , 编 译 不 能 通 过 , 需 要 tydef int*
NewType;
const int* const value;//*value,value 都不可变
(5)volatile
表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重
新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:
int,char,long......也适用于 C 的结构和 C++的类。当对结构或者类对象使用 volatile 修饰的时候,
结构或者类的所有成员都会被视为
volatile.
该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被
多个线程修改,而程序通过该变量同步各个线程。
简单示例:
DWORD __stdcall threadFunc(LPVOID signal)
{
int* intSignal=reinterpret_cast(signal);
*intSignal=2;
while(*intSignal!=1)
sleep(1000);
return 0;
}
该线程启动时将
intSignal 置为 2,然后循环等待直到 intSignal 为 1 时退出。显然
intSignal 的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会