您的位置:首页 > 编程语言 > C语言/C++

C/C++中有关const的用法

2015-04-19 07:21 260 查看
整理自网络

1、const修饰普通变量和指针

①const修饰普通变量有两种写法:

    const TYPE value;

TYPE const value;

两种写法效果一致,含义为:const修饰的类型为TYPE的变量value是不可变的

②const修饰指针变量

分四种写法如下:

A: const char *p;

B: char * const p;

C: char const *p;

D: const char* const p;

对于前三种可以改写为:

A: const (char) *p;

B: (char*) const p;

C: (char) const *p;

根据const修饰一般变量的规则,A=C

对于A,C, const修饰的类型为char的变量*p为常量,所以,p所指向的内容为常量不可改变。

对于B, 含义为const修饰的类型为char*的变量p为常量,因此,p指针本身为常量不可改变。

对于D, 其实为A,B混合体,表示指针本身和指针指向的内容两者都为常量不可改变。

一种区别方式:

沿着*号画一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向的内容为常量;

如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

2、const修饰函数参数

const修饰函数参数表示函数体重不能修改参数的值(包括参数本身的值或者参数中包含的值)

①参数为指针

void fun(const int var);    //传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)

void fun(const char *var); //参数指针所指内容为常量不可变

void fun(char* const var);//参数指针本身为常量不可变(无意义,因为char* var是形参,不是真正的实参本身,修改了不会影响实参)

②参数为引用

void fun(const type& var);//引用参数在函数内为常量不可改变

3、const 修饰函数返回值

const 修饰函数返回值的含义和const 修饰普通变量及指针的含义基本相同

①const int fun1();  //返回值不可改变,但没有意义,因为返回值本身是右值

②const int * fun2(); 

调用时const int *p = fun2(); 把fun2()看成是一个变量,那么就如上面1.①所示,表示指针指向的内容不可改变。

③int * const fun3();

调用时 int * const p = fun3(); 把fun3()看成一个变量,那么就如上面1.②所示,表示指针本身不可变。

4、const 修饰类对象、对象指针、对象引用

const 修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。

const 修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数都会有修改成员变量的企图。

例:

class AAA

{

void fun1();

        void fun2() const;

};

const AAA  obj;

obj.fun1();  //错误,常对象不能调用非 '常成员函数'

obj.fun2();//正确

5、const 修饰成员变量

const 修饰类的成员变量,表示成员常量,不能被修改,同时它只能在初始化列表中赋值

class A

{

……

const int Value;  //成员常量不能被修改

……

        A(int x): Value(x){} //只能在初始化列表中赋值

}

6、const 修饰成员函数

const 修饰类的成员函数,则该成员函数不能修改类中的任何成员变量,也不能调用类中的任何非const 成员函数

class A

{

……

void fun() const;

};

对于const 类对象、指针、引用,只能调用类的const 成员函数,因此,const 修饰成员函数的最重要的作用就是限制对于const对象的使用

7、const 常量与define宏定义的区别

①编译器处理方式不同

define宏是在预处理阶段展开

const常量是编译运行阶段使用

②类型和安全检查不同

define 宏没有类型,不做任何类型检查,仅仅是展开

const 常量有具体的类型,在编译阶段会执行类型检查

③存储方式不同

define 宏仅仅是展开,有多少地方使用,就展开多少次,不分配内存

const 常量会在内存中分配(可以是堆或者栈)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ c