const一般用法

 

1.
通常C++编译器不为const创建存储空间.而是把这个定义

2.
const int i=100;  // 一个编译期间的const
const int j=i+10; // 由于i是一个const , j的计算值来自一个常数表达式,而它自身也是一个编译期间的const
long address = (long)&j; //迫使编译器给j分配存储空间.
char buf[j+10]; //编译器知道j值是有效的.所以决定buf的大小时可以使用j
int main()

Unknown macro: {  const char c= cin.get(); //编译期不知道的.但由于是const 所以意味着需要存储空间.而编译器不保留它的符号表里的任何东西.                           //初始化必须在定义点进行,而且一旦初始化,其值就不能改变.  cont char c2=c+'a'; ... }

//如果想让一个值不变.就应该使之成为const.

3.
const int [] =

Unknown macro: {1,2,3,4}

;
//float f[i[3]]; //Illegal  不能在编译期间使用它的值.
int main()

Unknown macro: { .. }

4.
C++中,一个const  不必为创建内存空间,而在C中,一个const总是需要创建一块内存空间.
C++中,一般来说,如果一个const仅仅是用来把一个名字用一个值来代替(如同#define一样),那么该存储空间就不必创建.
不过,如果取一个const的地址(甚至不知觉地把它传递给一个带引用参数的函数)或者把它定义成extend,则会为该const创建内存空间.
如果在不同的文件中声明同名的const不取它的地址,也不把它定义为extend,那么理想的C++编译器不会为它分配内存空间,而是把它折叠到代码中.因为const在一个文件范围内有效,所以可以把它定义在文件头,在连接中不会造成任何冲突.

5.
const int* u;
u 是一个指针,它指向一个const int,这里不需要初始化,因为u可以指向任何标识符(即说,它不是一个const),但它指的值是不能被改变的。
int const*u; 并非 u是一个指向int的const指针 。而是,u是一个指向恰好是const的int的普通指针,效果与前面一样。
int d=1;
int* const w =&d; w是一个指向int 的const指针。这个值在指针的生命周期内不变。然而要改变它所指向的值是可以的。
可以写 *w=2;

小结:
cosnt int* u;
int const* v;
int d=1;
int* const w=&d;
const int* const x=&d;
int const* const x2=&d;
int main() {};

注:
可以把一个非const对象的地址赋给一个const指针,然而,不能把一个const对象的地址赋给一个非const指针。
char* cp = "howdy"; 被编译器作为一个常量字符数组建立,所引用该字符数组得到的字面值是它在内存中的首地址,修改该字符数组中的任何字符都会导致运行时错误,当然,并不是所有的编译器都能做到这点。
可行方法 char cp[]="howdy";

6参数与和返回值
const int g(); //这约定了函数框架里的变量不会被修改。另外,因为这是按值返回,所以这个变量被制成副本,使得初值不会被返回值修改。
const 看似没用:
int f3()

Unknown macro: { return 1;}


const int f4()

 

int main()

Unknown macro: { const int j=f3();//works fine int k= f4();     //this works fine too! }

const 在限制左值用法时有用:
class X

Unknown macro: { int i; public}

X:X(int ii)

Unknown macro: {i=ii;}

void X::modify()

Unknown macro: {i++;}

X f5()

Unknown macro: {   return X(); }

const X f6()

Unknown macro: {  return X(); }

void f7(X& x)

Unknown macro: {  x.modefy(); }

int main()

Unknown macro: {  f5=X(1); //ok  f5().modify() //ok  // f7(f5()); //cases warning  // causes compile-time errors}

注:
class X() {};
X f()

Unknown macro: { return X();}

void g1(X&) {}
void g2(const X&) {}
int main()

Unknown macro: {  // Erro}

}
函数f()按值返回类X的一个对象,这意味着当立即取f()的返回值并把它传递给另外一个函数时,将建立一个临时量,该临时量是const

7类里的const
类里的const(非static)  "在这个对象生命期内,它是一个常量"。对这个常量而言,不同的对象可以包含有一个不同的值。

//建立一个const成员函数,但仍然在对象中改变某些数据.方法:
按位const 和 按逻辑const
void Y::f() const

Unknown macro: {   // i++; // Erro }

int main()

Unknown macro: {  const Y yy;  yy.f();  ... }

class Z

Unknown macro: {  mutable int j;  public}

void Z:f() const

Unknown macro: {  j++;// ok }

8volatile
意思是: 在编译器认识的范围外,这个数据可以被改变"
如果编译器说: 我已经把数据读时寄存器,而且再没有与寄存器接触",一般情况下,它不需要再读这个数据.但是,如果数据是
valatile修饰的,编译器就不能作出这样的假定,因为这个数据可能被其它里程改变.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值