下面主要对const关键字的一些性质进行说明:
1)关于变量的作用于问题
我们知道一般头文件包含类的定义,extern变量声明和和函数声明,但是const定义的变量也可以放在头文件中。这是一个例外,因为const定义的变量与不带const定义的变量存在着很大区别,例如:我们定义(假设val和cval都定义在函数外内部):
点击(此处)折叠或打开
int val = 0;
int const cval = 0;
虽然定义的形式相似,但是val和cval的作用域却存在很大的差别。因为val定义形式相当于extern int val =0;也就是说val是一个全局变量(在函数外部非const和static变量定义默认加上extern关键字)。如果将val的定义放在头文件中,那将导致多重定义的错误,因为每个包含此头文件的文件都相当于定义一个全局变量val。但是cval却不存在这样的问题,因为const定义的变量默认情况下是文件作用于而不是全局作用于,也就是上面中的cval的定义不会在默认情况下加上extern关键字,从而const关键字定义的变量不是一个全局变量。这样即便将cval的定义放到头文件中也不会发生多处定义的错误,最多只是包含此头文件的文件中都有一个变量cval且其值相同而已。
2)关于引用的赋值问题
首先给出两段代码,如下:
点击(此处)折叠或打开
double dval = 3.14; double dval = 3.14;
const int& cval = dval; int& val = dval;
虽然表达式相似,但是右边非const的val引用定义却实非法的,为了说明这个问提,我们必须从编译器是如何处理上面两个式子说起,编译器会将上面的式子展开成如下形式(不同内置类型转换时都会发生):
点击(此处)折叠或打开
double dval = 3.14;
int tmp = dval;
const int& cval = tmp;
如果上式中右边val的定义是正确的,那么将导致与引用的定义相矛盾。我们具体举例说明,假设val的 定义是正确的,那么我们改变val的数值,根据引用的定义,我们知道dval的数值也将发生改变,但是编译器会产生一个中间值,这将导致对val的改变并不会导致dval数值相应的变化而是导致tmp数值的变化,而dval保持不变,从而这就与引用的定义相矛盾。但是const定义的变量却不存在这个问题,因为cval不允许改变cval的值,从而不会出现上面在说val时存在的问题。从而编译器允许cval的定义,但不允许val的定义。最后再说一句,上面的定义同样存在与我们平时感觉上不相符的问题,我们知道引用值应该和被引用值相同,然而对于const变量,在编译期,其值就被确定,而一旦在const之后改变了上面的dval值,这同样将导致cval和dval数值不同。为了避免这种情况,在进行上面的引用定义时,应该保持引用者和被引用者都是const定义。
3)关于函数的重载
我们知道C++中,函数重载是通过编译器重写函数名字来实现的(c++中重写函数也会将参数考虑进去,例如类型或大小),在实现的过程中也会将const作为类型进行考虑,重写函数名字。这个很好理解,比如void f(int)和void f(const int)。一个函数类型为(void)(*)(int),而另一个函数类型为(void)(*)(const int),这样自然定义的是两个不同类型的变量。这个常常用在配对函
数中,例如重载[]操作符时。
4)关于成员函数
有如下简单代码:
点击(此处)折叠或打开
class A{
public:
int get()const
{
//++val; //error
return val;
}
private:
int val;
};
我们知道,在成员函数get()中,是不可以改变成员变量的值的。例如在get中进行++val将会报错。为什么会报错呢?首先我们知道,在普通成员函数内访问成员变量是通过this指针来实现的,而this指针的类型为A*const。如果我们如上定义get函数时,在get函数内部的this指针的类型就不再是A* const,而是const A* const的类型。从而如果我们再去修改成员变量的值,自然会报错。也就是说,在成员函数末尾加上const相当于将A*const类型的this转化为const A* const类型的指针。
相关推荐
C++中const关键字详解
一 const基础;二 const的初始化;三 作为参数和返回值的const修饰符;四 类成员函数中const的使用;五 使用const的一些建议。
C++中const关键字详解
现在读到了const关键字的用法,书上面讲解的时候并没有给出完整的实例,只是理论的讲解了一些知识,后来在网上面搜了关于const的关键字的讲解,但是搜到的内容和书上面讲解的内容有着非常让人疑惑的东西,看看下面的...
关于C/C++中的const关键字的用法,你了解多少呢?
const关键字 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。不管出现在任何上下文都是为这个目的而服务的。 const使用方法 定义const对象 const修饰符可以把对象转变成常数对象...
C/C++ 嵌入式 一些关键字: volatile关键字 Const关键字 static关键字 mutable 关键字
关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性
本文档详细介绍了C++中关键字const的用法,并给出了具体的示例来帮助读者理解
const是一个C++语言的限定符,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。 define与...
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性。这篇文章主要介绍了C/C++ 中const关键字的用法,需要的朋友可以参考下
当你只在定义该const常量的文件中使用该常量时,c++不给你的const常量分配空间–这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const int c = 0;相当于#define c 0; 当在当前文件之外...
简单的说const关键字修饰的变量具有常属性,也就是说它所修饰的变量不能被修改,下文给大家介绍C/C++中const关键字的用法及其与宏常量的比较,需要的朋友可以参考下
这篇文章主要介绍了C++编程中的const关键字常见用法总结,const关键字的使用是C++入门学习中的基础知识,需要的朋友可以参考下。
浅谈C++中的几个关键字static,const,inline.doc 浅谈C++中的几个关键字static,const,inline.doc
C++的有些关键字的详解,收集一下很有帮助的