C/C++ --- const

一.C的const

1.1const的作用

        有时候我们希望定义一种变量,其值在整个作用域都不被改变,一旦改变就会报错。这时候就需要const对变量修饰,使其成为常变量,并且在定义的时候要被初始化,定义后不被改变。

const int a=10;
1.2const与指针

const指针位置的不同会有不同的影响

  • const int *p:p是一个指向int类型的const指针,p指向的地址可以改变,但是*p无法修改数据
  • int const *p:同上。
  • int *const p:p指向的地址不可以改变,但*p可以改变数据
  • const int * const p:p指向的地址可以改变,*p无法修改数据

        const离变量名近就是用来修饰指针变量本身的, 离变量名远就是用来修饰指针指向的数据,如果近的和远的都有, 那么同时修饰指针变量和它指向的数据。

从其他博客看到一种记忆的方法:

const int *p:这个const作用于解引用符 **p被定义为常量 ,所以不能修改 *p的值。

int *const p:这个const作用于指针p指针p指向的地址不能被改变。

const int * const p:两个const分别作用于解引用符 *指针p,所以既不能改变数据也不能改变p指向的地址。

1.3 const和函数形参

1.在传参过程中形参是指针,为防止在函数内部修改指针指向的数据,故而加上const进行保护。

eg:void StringCopy(const char* str);

给*加上const,那么*str为常量,一旦函数体修改str, 编译器就会报错。

2.当参数是引用,为了提升效率且防止修改

void func(A a);

值传递会产生A类型的临时对象,其中对象的构造,复制,析构消耗时间。

对于内部数据类型的输入参数,就不要将“值传递”的方式改为“const 引用传递”,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。

void func(const A&a);

const引用传递就不会产生临时对象,并且不会改变对象。 

对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。

二.C++中的const

2.1 C++的const像是编译阶段的#define
const int a=1;
int b=a;

        C --- 编译器先到a所在的内存取出一份数据, 再将这份数据赋给另一个b。

        C++ --- 编译器直接将1赋值给b。

2.2 C++中全局const变量的可见范围是当前文件

        若想在其他文件访问const全局变量,那么在定义的时候就给加上extern。或者直接将其定义在.h的头文件中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值