微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > C++中const与指针、引用的分析

C++中const与指针、引用的分析

时间:12-01 来源:互联网 点击:

指向常量的指针指向的数据只是针对这个指针而言,他认为自己指向的数据是常量,休想通过他来修改指向的对象。也就是说指向常量的指针在初始化、赋值的时可以初始化或者赋值为非const变量的地址,即可以指向非const的对象,只是不能通过该指针来修改对象罢了。
同时需要注意:对于指向const的指针,初始化过程比较方便,不要求是const对象的地址,可以采用非const对象的地址初始化,甚至还可以采用指向非const的指针直接赋值初始化,这时指针自己认为自己指向的对象是常量。但是不能将指向const的指针直接赋值给指向非const的指针,如果不小心赋值也会出现上面出现的问题。下面参看一段小的代码,说明其中的一些问题。

#include
#include
#include

using namespace std;

int main()
{
int num = 20;
const int array_size = 10;

int *pnum = #
const int * cpnum = #
/*const int *指针可以采用int *指针直接初始化*/
const int *csize1 = pnum;

/*但是int * 指针不能采用const int *制作初始化*/
//int *psize = &array_size;
/*const类型数据只能采用指向const的指针来指向*/
const int *csize = &array_size;

cout < "Before change..." < endl;
cout < "The num of num = " < num < endl;
cout < "*pnum = " < *pnum < " "
< "*cpnum = " < *cpnum < " "
< "csize1 = " < *csize1 < endl;

num = 30;

cout < "After changed..." < endl;
cout < "The num of num = " < num < endl;
cout < "*pnum = " < *pnum < " "
< "*cpnum = " < *cpnum < " "
< "csize1 = " < *csize1 < endl;

return 0;
}


从上面的结果我们可以知道指向const的指针可以采用非const变量的地址进行初始化或者赋值操作,同时也可以采用指向非const指针直接初始化指向const的指针。同时指向const的指针不能赋值给指向非const的指针,会出现const int *不能转换到int *的问题。

3、const与引用
关于const和引用在一起情况下也存在一些类似于指针的情况,但是毕竟引用相比指针要简单,这时候情况也比较简单.但是我认为分析引用应该与分析指针是一样也存在类似的问题。但是引用就只有两种,非const的引用和const的引用。

int num = 10;

int &newname = num;
const int &othername = num;

引用主要是上面的两种,这两种的区别相对来说比较大,而且加入了const限定符以后,引用的能力往往变的更加的强大。
一般来说对于const对象而言,一般只能采用const引用,这与前面的const对象只能采用指向const对象的原因是一样的,如果对引用没有进行限定,可能会通过引用修改数据,这是不允许的。也就是说const引用与指向const对象的指针有一定的相似性,即不能通过这个引用或者指针来修改原来的数据。保证数据的const特性。也就是说非const引用不能引用const对象,如果不小心引用编译器会出现下面的错误:

invalid initialization of reference of type ‘int&’ from expression of type ‘const int’

因此非const引用只能针对非const的同类型数据。这是需要注意的。比如string,和字符串字面值都不能直接引用。因为类型不相同,这是在C++函数定义中经常出现的问题,在后期的博文中再分析。在引用中加入const的就是对于这个引用而言,不能通过自己来修改原始的数据,这与指向const的指针有很大的相似性,

但是往往const引用的初始化并不一定要去对象是const的,甚至可以是不同类型的对象,这种优越性是连指针(指针只能指向同一类型的数据,如果一定要指向需要强制类型转换)都没有的,也就是可以将不同类型的非const或者const对象来初始化一个const引用。但是这个const限定符就限定了该引用指向的对象是不能通过该引用来修改的。如果尝试采用const的引用进行修改,编译器会出现如下的错误:

error: assignment of read-only reference...

综合上面的描述可知:非const引用只能绑定到该引用同类型(string和字符串字面值(const char *)之间都不可以)的非const对象,而const引用则可以绑定到任意的一种对象上(非const、const、甚至不同类型),这种差别在函数的参数中有较大的体现。
通过下面的例子来说明一下上面的分析:

#include
#include
#include

using namespace std;

int main()
{
int num = 20;
const int array_size = 10;

int &pnum = num;
const int &cpnum = num;
/*采用引用直接初始化const类型的引用*/
const int &csize1 = pnum;

/*const的变量不能采用非const的引用*/
//int &psize = array_size;
/*const类型数据只能采用指向const的指针来指向*/
const int &csize = array_size;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top