const不同位置带来的区别

const不同位置带来的区别

今天同学问我数据结构时,我对以下代码懵了一下:

template <class T> class Link{
public:
    T data;
    Link<T>* next;
    Link(const T info, const Link<T>* nextValue=NULL){
        data = info;
        next = nextValue;
    }
    Link(const Link<T>* nextValue){
        next = nextValue;
    }
};

这是一个单链表的节点定义,我第五行,第一个构造函数的第二个参数有点懵。

我当时寻思着,把这个指针定义为const类型,那不永远都指向空了吗?那我为什么后面还能改变呢?查询之后发现是我对const不同位置的作用不了解。

以下两种声明方式的区别是什么?

const double* p;
double* const p;

众所周知,const是规定任何类型的一个变量为常量。而C++内部的规定是,const将修饰紧随他的对象。引用Stack Overflow的原话是:

You can always put the const after whatever is declared const.

所以第一种形式,也就是

const double* p;

这个const是指这个double是不变的,p是一个指向常量双精度浮点数的指针。也就是这个double数的值不可以再改变了。
所以我最开始提出的例子,是指这个构造函数传入的节点不能改变。而不是这个指针永远都指向NULL。

第二种形式,是

double* const p;

同理,是指p是一个指向双精度浮点数的常量指针不变的是p的值,也就是说p不能再指向别的对象。

那么,如果没有指针的话,下面这两种情况是没有区别的。

const int a;
int const a;

但是一般建议写上面那种形式。

这里再转载别人文章里的一段话:

Bjarne 在他的《The C++ Programming Language》里面给出过一个助记的方法——“以 * 分界,把一个声明从右向左读”。
注意语法,* 读作 pointer to (指向...的指针),const (常量) 是形容词,char (变量类型) 和 p (变量名) 当然都是名词。

  1. const char * p 读作:p is a pointer to a const char,译:p 是一个指针(变量),它指向一个常量字符(const char)。
  2. char * const p 读作:p is a const pointer to a char,译:p 是一个常量指针(const p),它指向一个字符(变量)。

从两处蓝色标记也能看出前面提到的“const 修饰离开最近的对象”的说法。

出处:https://blog.csdn.net/JPEXE/article/details/2157436

原文链接: https://www.cnblogs.com/scyq/p/12419267.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    const不同位置带来的区别

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/194008

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午6:33
下一篇 2023年2月12日 下午6:33

相关推荐