background image

      

  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 的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会