const关键字总结

const总结

const的基本属性

C/C++中const关键字的作用是用来定义一个常量,并且在定义的时候必须进行初始化,因为常量不可修改。

const in a = 100;
a = 200;//error!
const string s = "helloworld"

const与指针的关系

指针常量、常量指针,你真的分得清吗?

首先,分辨这两种指针的方法就是观察在定义的时候const与“*”的前后位置关系,然后按照顺序读出来就好,const读作常量,“*”读作指针。

比如下面这个例子中const在“*”的前面,所以这是一个常量指针,常量指针是一个只能指向常量的指针常量指针可以指向变量,只不过这个变量的值不可以通过这个常量指针来改变。(常量指针定义时const与int可以交换位置)

int a =100;
const int* p = &a;  //正确! 常量指针可以指向一个变量,并非只能指向常量。
(*p)++;  //错误,无法通过常量指针修改变量的值。
a++;  //正确,a是一个变量,可以进行运算。

下面这是一个例子中“*”在const的前面,所以这是一个指针常量,指针常量是一个专一的指针,这个指针这一生只能指向一个变量,而且在出生的时候就必须被安排好了,但是对于它指向的变量没有任何要求,可以随意更改变量中的值,可以理解为痴心男碰上了浪荡女。

int* const p;		//error! 指针常量初始化未赋值

当然还有最后一种痴心男和挑剔女的结合体,叫做只能指向常量的指针常量

const char * const p = &a;

const与函数的关系

(1). const int 修饰函数

const int func();

这个没什么意义,函数本身就不可以在程序执行过程中被修改。

(2).const int* 修饰函数

const int* func();

首先这个函数的返回值类型为一个指针,且这个指针为一个常量指针,只能指向常量的指针。(同样的,这里的const和int可以交换位置)

(3).int* const 修饰函数

int* const func();

这个函数的返回值是一个指针常量,指针变量的值不可修改,即指针的指向不可修改,但指针指向的空间的数值可以随便修改,这个符合一般情况下使用函数加指针的情形。

(4).const修饰函数参数

4.1函数参数为指针常量
void func(const int var); // 传递过来的参数不可变
void func(int* const var); // 指针本身不可变

传递过来的参数或指针在函数内不能被修改,所以在函数内部参数及指针本身只能被使用,不能改变指向,但是指针指向的空间中的值可以随意修改,所以其实没什么意义。

4.2函数参数为常量指针
void func(const char* src, char* dst);

其中src 是输入参数,dst 是输出参数。给src加上const修饰后,如果函数体内的语句试图改动src的内容,编译器将指出错误。这就是加了const的作用之一。

4.3函数参数为一个对象的引用
void func(const A &a);

首先在传参时使用引用而不是直接传参是为了提高效率,对于非内部数据类型的参数而言,象void func(A a) 这样声明的函数注定效率比较低。因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。

为了提高效率,可以将函数声明改为void func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临 时对象。

但是使用引用的方式存在一个问题那就是有可能会不小心对被引用的对象造成修改,为了避免这样的情况发生,可以使用const关键字修饰引用。

两个面试小问题:

  • 如果函数需要传入一个指针,是否需要为该指针加上const,把const加在指针不同的位置有什么区别?
  • 如果写的函数需要传入的参数是一个复杂类型的实例,传入值参数或者引用参数有什么区别,什么时候需要为传入的引用参数加上const?

const与enum以及#define之间的关系

const 有地址,enum与#define没有地址

  1. const 定义的实际是一个变量,const只限定它不能被修改,所有变量都可在程序运行时获取其地址。
  2. enum类型中的枚举项只是enum类型声明的一部分,它不是定义出来的变量,所以不能取地址。
  3. #define出来的是宏,它是预处理的东西,预处理后的编译阶段已经不存在,所以也不可能获取宏的地址

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值