您的位置:首页 > 编程语言 > C语言/C++

const详解--C++

2015-08-18 15:07 323 查看
C++常量(关键字const)主要是为了使程序员能够在变和不变之间画一条直线。

const的最初动机是取代预处理器#define来进行值替代。

原因:C语言中预处理器可以不受限制的建立宏并用它来代替值。因为预处理器的值只做些文本替代,它并没有类型检查概念,也没有类型检查功能。所以预处理器的值替代会产生一些微小的问题,这些问题在C++中可以通过使用const值来避免,将值替换交给编译器。

const用法一-----值替代

C语言典型的预处理器值替代:

#define BUFFSIZE 100

C++做法:

const int buffsize = 100;

char buf[buffsize];

编译器可以执行常量折叠,即编译器在编译时通过必要的计算将一个复杂的常量表达式简化。

要使用const而非#define,同样必须将const定义放在头文件中。C++中的const默认为内部连接,所以const仅在被定义过的头文件里才是可见的,而在连接时不被其他编译单元看到。通过C++编译器并不为const创建存储空间,它只是将这个定义保存在它的符号列表中。

C语言和C++中const区别:

const int buffsize = 100;
char buf[buffsize];
在C++中,一个const不必创建内存空间,而在C语言中,一个const总是需要创建一块内存空间。在C++中,是否为const常量创建内存空间依赖于对他=它如何使用。一般来说,如果仅仅是将const用来将一个名字用一个值替代(如同使用#define一样),那么该存储空间就不必创建;如果取一个const地址或者将它定义为extern,则会为该const创建存储空间。

const用法二-----指针

const修饰最靠近它的标识符。

const int* u; //u是一个指针,它指向一个const int型的变量。

int const * v; //v是一个指向int的const指针。

int * const w; //w是一个指针,这个指针是指向int的const指针。

const int* const p; //p是一个const指针,它指向const int对象。

C++在指针类型检查也很严格:可以把非const对象的地址给一个const指针,因为也许有时不想改变某些可以改变的东西;但不能将一个const对象的地址赋值给一个非const指针,因为这样做可能通过被赋值的指针改变这个对象的值。当然也可以用强制类型转换来实现这样的操作,但是这是不好的程序设计习惯,打破了const提供的安全性。

const用法三------函数参数

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



在函数里,const的意义是参数不能被改变,所以它其实是函数创建者的工具,而不是函数调用者的工具。为不使函数调用者混淆,在函数内部用const限定参数优于在参数表中用const限定参数。可以用一个指针来实现,但更好的语法是“引用”。引用像一个被自动间接引用的常量指针,它的作用是成为对象的别名。

不引起混淆的函数定义应该是这样的:

void f(int ic){
const int & i = ic;
i++;//illegal
}
这时的局部对象的常量性不是函数的标志部分,它仅对函数实现有意义,对客户来说是不可见的。

const用法四------返回值

对内建类型来说,按值返回的是否是一个const是无关紧要的,所以按值返回一个内置类型时,应该去掉const。const没有意义的原因是编译器已经不让它成为一个左值。

.0

当处理用户自己定义的类型时,按值返回常量就很重要,如果一个函数按值返回一个类对象为const时,那么这个函数的返回值不能是一个左值(即它不能被赋值和修改)。

传递和返回地址

如果传递或返回一个地址(指针或引用),客户程序员就能取地址并修改其初值。如果使这个指针或引用是const就能阻止这类事情的发生。事实上在任何时候传递地址给一个函数都应该用const去修饰。

在C语言中传递地址用指针;在C++中传递指针首先选择按引用传递,而且是const引用。对函数创建者来说,传递地址总比传递整个类对象更有效,如果按照const引用来传递,意味着函数将不改变该地址所指的的内容,效果就像按值传递一样。

const用法五-----类

1、类中的const常量(该类的不同对象均有常量值)

典型的例子:在一个类中创建数组,(1)数组大小用#define宏定义:所有的#define从定义的地方起就被预处理器看成是全局的,宏定义的名字在另一个类中可能引起冲突;(2)用const代替#define。在类中,const意味着“在这个对象生命期内,它是一个常量”,然而,不同的对象可以含有不同的值。类中的const常量需要在构造函数初始化列表中进行初始化。

如何让一个类有在编译期的常量?使用static关键字,含义“不管类的对象创建多少次,都只有一个实例”。一个内建类型的static const 可以看做是一个编译期的常量。必须在static const 定义的地方对他进行初始化(不在构造函数中初始化):

static const int size = 100;


2、const 成员函数

const成员函数必须在成员函数的声明处是const,还必须在成员函数的定义处重申为const,否则编译器把它看做是不同的函数。const成员函数不允许修改对象中的数据成员。

int f(int i)const{}
构造函数和析构函数不是const成员函数,因为他们在初始化和清除时,总是对对象做一些修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: