C++ 中的 const 类型变量

之前总感觉C/C++中有const 限定的变量是个非常头痛的问题,一会儿可以变,一会儿不可以变,一会儿把const赋给nonconst,一会儿又把nonconst赋给const,头都被它搞大了。今天刚好把《C++ primer》中的相关部分又读了一遍,所以就把相关的内容写出来总结一下啦!

首先,我们可以想想为什么要设计const变量这种东西,不过就是想有个常量嘛!所以对const类型变量进行操作的核心原则就是不能改变该变量的值,其他操作的话,const还是不const影响其实不大。

然后我们可以想到的是,既然在程序执行过程中,不能改变const变量的值,那么我们在对该变量进行定义的时候就必须对它进行初始化。对于像int,double这样的普通变量来说,初始化一般有如下三种方式:

const int i = fun(); //利用函数返回值初始化
const int j = 42;//字面值
const int k = i;//其他变量

这里我们值得注意的是第一种和第三种的赋值方式。我们可能会有这样的疑问,万一i的类型或者fun函数的返回值的类型不是const int类型的怎么办呢?这时候我们就可以想想前面提到过的那个原则了。由于赋值只是将一个变量的值赋给另外一个,从此之后两者就基本上每什么关系了。所以不会对原来const类型变量的值产生影响。所以赋值操作完全可以无视等号两边的变量类型。

普通类型变量的const相关问题还是非常简单的,下面就再来讲讲reference(引用)和pointer(指针)的相关问题。我们都知道引用类型也是必须要初始化的,并且在初始化之后不能再将该引用指向其他的变量。这点与指针有很大的不同。所以我们完全可以认为引用本身就是const的,因为它自己的值是不能改变的。现在我们有下面四个赋值语句:

int       j
const int i;

const int &r1 = i;
int       &r2 = j;
const int &r3 = j;
int       &r4 = i;

很明显,前面两条的赋值语句是不会有任何问题的,因为等号两变的变量类型是完全一样的。事实上我们完全可以将一个const类型的引用指向一个nonconst类型的变量,就像第三个等式一样。因为我们只要保证变量的值不能通过r3进行改变就可以了,至于实际上j的值变不变是不在r3的管辖范围之内的,或者说即使变了也无所谓,j本来就是nonconst类型的。但是,如果反过来将一个noncosnt类型的引用指向一个const类型的变量就不行了,因为你此时可以同过r4去改变一个const类型变量的值。

最后我们来看看指针类型的const问题。如下所示,对于一个指针变量来说,const一般会存在在两个位置:

int        a;
const int *p = &a;
int *const q = &a;

对于第一种类型,我们可以和对引用的操作做一个类比,其实是差不多的。那么对于第二中声明怎么解读呢?正如《C++ primer》中所说的那样,我们可以从变量开始从右往左读,q前面首先是const。所以q自己的值是不变的。再往做是 int*,因此q就是一个指向int类型的const变量。因为q本身是const的,所以它的值不能改变,始终指向变量a。

总之,说到底还是开头说过的那句话,const类型变量的核心原则是它的值不能改变。只要以此进行判断,不管是references to const ,pointers to const,consts pointer,还是const赋值给nonconst,nonconst赋值给const,我想都不是问题啦!

时间: 2024-08-25 03:37:59

C++ 中的 const 类型变量的相关文章

C与C++中的const

同样,有下面一段代码: 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 const int i = 0; 7 int *j = (int *) &i; 8 *j = 1; 9 cout<<"i address = 0x"<<hex<<&i<<","<<"j address = 0x&qu

C++中关于const的一些使用惯例

最近在公司使用C++做项目,对工作中发现的问题进行总结! 大家都知道,C++的const关键字是申明一个常量,以前没有深入接触C++的时候也没觉得有什么特别的用法. 下面说说我最近工作中发现的关于const的一些使用惯例,我这里所说的使用惯例,是指C++编码中推荐的做法. 1)函数中的const参数 我们可能会看到类似这样的一个函数声明: void copy(const string& strDestination, const string& strSource); 上面的函数实现将字符

C++ 类中的const关键字

//类中的const关键字 #include<iostream> using namespace std; class Point{ public: //这个const关键字本质上修饰的是this指针 int GetX() const //====>int GetX(const this) { //因为this被隐藏,所以const关键字只好写在函数后面 //x++; //加上const关键字 报错 error C3490: 由于正在通过常量对象访问“x”,因此无法对其进行修改 //这个

C++总结:C++中的const和constexpr

C++中的const可用于修饰变量.函数,且在不同的地方有着不同的含义,现总结如下. const的语义 C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象的常量性的操作都视为error. 对象的常量性可以分为两种:物理常量性(即每个bit都不可改变)和逻辑常量性(即对象的表现保持不变).C++中采用的是物理常量性,例如下面的例子: 1 2 3 4 5 6 7 struct A {     int *ptr; }; int k = 5, r = 6;

C++ 中有关const引用的一点小知识

在读<C++ Primer>时,发现之前对const的概念不是很清晰,只知道如何去使用,于是翻开const引用部分又阅读了一遍,发现有两点自己要注意的地方 1.const限定的对象不可以初始化非const引用 ex. 1 const int src = 512; 2 const int &ok_dest = src; //ok: 引用和初始化对象都是const 3 int &err_dest = src; //error : 引用为非const 原因很简单, src 是不可以被

详解C和C++中的const关键字

在讲下面的内容之前,要先看看这篇文章const.static变量的存储位置 一.C中的const 作用:(1)可以定义const常量,具有不可变性. (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患. (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改. 同宏定义一样,可以做到不变则已,一变都变! (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性. 还是上面的例子,如果在函数体内修改了i,编译器就会报错: (5) 可以节省空间,避免不必要的内存

C/C++中的const真正的用法

const基础知识(用法.含义.好处) intmain() { constint a; intconst b; constint *c; int* const d; constint * const e ; return0; } Intfunc1(const ) 初级理解:const是定义常量==>const意味着只读 含义: //第一个第二个意思一样代表一个常整形数 //第三个c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改) //第四个d常指针(指针变量不能被修改,但

C++中的const完全解析

1. const修饰普通变量和指针 const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的.对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value只不可变.例如:const int nValue:         //nValue是constint const nValue:    // nValue是const但是对于指针类型的TYPE

C/C++中的const与define

const int main() { const int a; int const b; const int *c; int * const d; const int * const e ; return 0; } 含义: 第一个第二个意思一样 代表一个常整形数 第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改) 第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改) 第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改) 结