现在的位置: 首页 > 综合 > 正文

C/C++中const用法小结

2013年10月09日 ⁄ 综合 ⁄ 共 2430字 ⁄ 字号 评论关闭


C/C++中const用法小结

 
  
1)可以定义const常量       

    例如:
             const
int Max=100;
             int
Array[Max];       
  
2)便于进行类型检查         

   
例如:
             void
f(const int i) { .........}
       
编译器就会知道i是一个常量,不允许修改;
  
3)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
       
还是上面的例子,如果在函数体内修改了i,编译器就会报错;
       
例如:
             void
f(const int i) { i=10;//error! }
    (4)
为函数重载提供了一个参考。
         class A
         {
           ......
           void f(int
i)       {......} file://
一个函数
           void f(int i)
const {......} file://
上一个函数的重载
            ......
          };
     (5)
可以节省空间,避免不必要的内存分配。
        
例如:
             
#define PI 3.14159         file://
常量宏
             
const doulbe  Pi=3.14159;  file://
此时并未将Pi放入ROM
             
......
             
double
i=Pi;              
file://
此时为Pi分配内存,以后不再分配!
             
double
I=PI;              
file://
编译期间进行宏替换,分配内存
             
double
j=Pi;              
file://
没有内存分配
             
double
J=PI;              
file://
再进行宏替换,又一次分配内存!
         const
定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
   
6 提高了效率。
          
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

使用const
   A
、修饰一般常量,常数组,常对象
   修饰符const可以用在类型说明符前,也可以用在类型说明符后。 例如:  
           int const x=2;
  或  const int x=2;

       int const
a[5]={1, 2, 3, 4, 5};   
  const int a[5]={1, 2, 3,

4, 5};

           class A;      const A a; 
     A const a;
     
   B
、修饰指针
        const int *A;   
  int const *A; //const修饰指向的对象,A可变,

      A指向的对象不可变
        int *const A;
            
//const
修饰指针A     A不可变,A 

      向的对象可变
        const int *const
A;      //
指针AA指向的对象都不可变

     C、修饰引用
 
      
const double & v;     
该引用所引用的对象不能被更新

(引用占用内存,内存中存放的是被引用对象的地址;)
D
、修饰函数的返回值:
        const
修饰符也可以修饰函数的返回值,是返回值不可被改变,格式

如下:
            const int
Fun1();
            const
MyClass Fun2();

7)修饰类的成员函数:
        const
修饰符也可以修饰类的成员函数,格式如下:
            class C
         {
            
public:

C(int i){this->i
= i;}
           
      int Fun() const;//类中的成员变量均为const类型
           
       
.....

public:

int i
             }

       
这样,在调用函数Fun时就不能修改类里面的数据 ,如

int Fun() const

{

       this i = 10;//试图改变成员变量,错误;

     return i;

}

再如:

int &Fun()
const

{

//         this i = 10;//试图改变成员变量,错误;

     return
i;//
试图将一个const int 返回给一个int的引//用,错误;

}

8)修饰一个返回引用的成员函数:

如:

int &Fun()

{

     Ruturn
i;

}

 

main()

C c(5);

c.Fun() = 100;//对此函数赋值;
但如果

const int &Fun()

{

     Ruturn
i;

}

c.Fun() = 100;//试图对此函数赋值,就会出错,因为返回是个const//引用了;

当然

const int &Fun() const

{

     Ruturn
i;//
正确

}


(9)类成员数据的初始化

class C
     {
         public:

              C(){}

              ~C(){}

public:

static const int m_nAge = 10;//VC中不允许,在VS2005

//中可以,值得关注这本身就是在C++语法中是允许的(详见//C++Primer
  }

抱歉!评论已关闭.