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

整理自网络

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 常量会在内存中分配(可以是堆或者栈)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值