c++ const 关键字 学习笔记

const简单介绍:

1不再使用c中的#define,c++默认不给const定义的变量分配内存,所以它默认的是仅本文件可以看到该变量(即internal linkage),

const int bufisze;

如果工程中的文件看见,就要明显的写出关键字extern,即,此时编译器会给它分配内存。

extern const int bufisze = 100;

 

另外:

extern const int bufsize;//只是声明不是定义

const int bufsize=10;//必须加上如此定义

// int bufsize=1;!error
//bufsize=1;erro

const buf;//错误,因为默认的只有内部文件可见,必须定义的时候就初始化。

2 const修饰参数

表示该参数不能改变。

void  f(const int i){
i++;//error}

注:

在使用某些类,特别是比较大的类的时候,我们经常看到参数的形式如  fun(const Integer & a),(Integer 是某个自定义类)使用引用和const。我对此的理解是:

1  ”引用参数”的效率优于“传值参数”。传值调用参数是一个局部变量,会被初始化为相同的参数值,那么调用函数时候会存在两个副本,而引用相当于直接用了那个地址的参数。(所以函数中若改变了引用的参数,结果会保留)

2我们既不想创造两个副本,所以用“引用&”,不要确定该类的参数没有被改变,所以经常我们会看到这种语法,

const Integer & a,既提高效率,又确定不改变类a

3返回Const(Returning by const value)//防止该函数作为左值lvalue

主要针对,返回值为自定义的类,对于built-in type(如int,double),加不加无所谓。

const X f6();

f6()=X(1)//error

其目的就是为了实现用户自定义类型与内置类型最大限度的保持一致性。

比如操作 a+b = c; 对于内置类型在编译时,会弹出不能对lvalue进行赋值的错误;然而对于用户自定义类型,比如class A{}; 当对A定义了形式为

A operator+(const A& lhs, const A& rhs){};的接口时,编译和连接过程不会出现内置类型弹出的错误。

解决办法就是给函数的返回值加上const标识,指定不能对函数的返回值进行赋值,如此一来,对于自定义类型,再进行a+b = c;操作时,编译过程也会报错。

在现实的编码中,可能谁也不会敲出a+b=c;这样的单纯语句,但是你不可能保证在你想表达if(a+b == c)时,却一时马虎写成了if(a+b = c),程序能够编译连接通过,但不是按你想要的逻辑运行,于是问题就出现了,这个问题应该再编译时期就被发现的

//此段参考http://blog.csdn.net/zhjxin1800/article/details/7584375

4成员函数Const

如果你有一个成员函数,他不应该更改该对象成员(非静态)的值,就应该在声明,定义最后加const

void ouput() const;

该类的const对象,只能调用const成员函数,不能调用非const成员函数。

本人水平有限,怀着分享学习的态度发表此文,欢迎大家批评,交流。感谢您的阅读。

欢迎转载本文,转载时请附上本文地址:  http://www.cnblogs.com/Dzhouqi/p/3393203.html                                                         

另外:欢迎访问我的博客 http://www.cnblogs.com/Dzhouqi/

原文地址:https://www.cnblogs.com/Dzhouqi/p/3393203.html