【005 关键字】const的作用及使用条件

一、const常见用法

  常变量:  const int 变量名(变量值不可改变)

  常引用:  const int &引用名(int &a=b 相当于 int *const a=b,所以引用必须初始化,const int&a=b 相当于 const int *const a=b,指向内容和指针都不可变)

  常对象:  类名 const 对象名 或 const 类名 对象名

  常数组:  const 类型标识符 数组名[大小]  类型标识符 const 数组名[大小]    

  常成员函数:<类型标识符> 类名::fun(形参) const

  常量指针、指针常量:const 类型说明符* 指针名 ,类型说明符* const 指针名

  指向常量的指针:const 类型标识符* const 指针名


二、const的作用

cosnt保证数据在它的生存期内不会被改变。

1、定义变量(局部变量或全局变量)为常量

const int N=100;//定义一个常量N
N=50; //错误,常量的值不能被修改
const int n; //错误,常量在定义的时候必须初始化

2、修饰函数的参数(传地址、引用时)

表示函数体内不能修改这个变量,只能用,不能变。

3、修饰函数的返回值

        a、const修饰普通类型的返回值(如int、float等)

        由于返回值是一个临时变量,函数调用结束后临时变量的生命周期也就结束了,因此将这些返回值修饰为const类型是没有意义的(如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加 const 修饰没有任何价值,详见c++中不能返回临时变量的引用或者指针的问题

        b、const修饰指针类型的返回值

        若函数的返回值是指针,且用const修饰,则函数返回值指向的内容是常数,不可被修改,此返回值仅能赋值给const修饰的相同类型的指针

const int test()  //定义一个函数
char *a= test() //错误,因为str没有被 const修饰
const int *a=test() //正确

4、节省空间,避免不必要的内存分配(具体含义请理解下代码)

#define M 3 //宏常量
const int N = 5; //此时并未将N放入内存中
int main()
{
  int i = N; //此时为N分配内存 ,以后不再为N分配
  int I = M; //预编译期间进行宏替换,分配内存
    int j = N; //没有为N进行内存分配
    int J = M; //在进行宏替换,又一次分配内存
}

三、使用const的情况

1、常变量

int const x=2;const int x=2; // 没有区别

2、常数组        

// 作用相同
int const a[8]={1,2,3,4,5,6,7,8}
const int a[8]={1,2,3,4,5,6,7,8}

3、常对象

class A:
const A a:
A const a:

一旦将对象定义为常对象之后,就只能调用类的 const 成员(包括 const 成员变量和 const 成员函数)了。

4、常指针

const int*p; //常量指针,指向常量的指针。即p指向的内存可以变,p指向的数值内容不可变
int const*p; //同上
int*const p;//指针常量,本质是一个常量,而用指针修饰它。 即p指向的内存不可以变,但是p内
存位置的数值可以变
const int* const p;//指向常量的常量指针。即p指向的内存和数值都不可变

5、常引用

const int &a = b;

首先进一步理解引用: int &a=b 相当于 int *const a=b。const int &a=b就相当于 const int * const a=b。不仅仅是a这个地址不可修改,而且其指向的内存空间也不可修改。

6、修饰函数的参数

void Fun(const int Var)

告诉编译器Var在函数体中不能被改变,从而防止了使用者一些无意的或错误的修改,一般在传入的参数是指针类型或者引用类型时常用const修饰, 防止函数改变其值。

7、修饰函数的返回值

上面已经详细讲过。

8、在另一连接文件中引用const变量

extern const int j=10;

四、const 和非 const 类型转换

简单来说就是,const char *和char *是不同的类型,不能将const char *类型的数据赋值给char *类型的变量。但反过来是可以的,编译器允许将char *类型的数据赋值给const char *类型的变量。char *指向的数据有读取和写入权限,而const char *指向的数据只有读取权限,降低数据的权限不会带来任何问题,但提升数据的权限就有可能发生危险

#include <stdio.h>

void func(char *str){ }

int main(){
    const char *str1 = "c.biancheng.net";
    char *str2 = str1;
    func(str1);
    return 0;
}

上面的代码中直接将 const 类型的数据交给了非 const 类型的变量,编译器不会容忍这种行为,会给出警告,甚至直接报错。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kashine

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值