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

const不同位置带来的区别的更多相关文章

  1. const的位置与区别

    转自  http://www.cnblogs.com/wucx/p/4566176.html 一个比较经典的问题——问以下两种声明的区别:1)  const char * p2)  char * co ...

  2. const 在C++中的区别

    一.Const作用    如下表所示: No. 作用 说明 参考代码 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有 ...

  3. JavaScript中const、var和let区别浅析

    在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...

  4. 实例讲述PHP面向对象的特性;;;php中const与define的使用区别

    php中const与define的使用区别 1.const:类成员变量定义,一旦定义且不能改变其值. define:定义全局常量,在任何地方都可以访问.2.define:不能在类中定义,而const可 ...

  5. const放在函数前后的区别

    转载:const放在函数前后的区别 一.const修饰指针 int b = 500; 1.const int * a = & b; 2.int const * a = & b; 3.i ...

  6. PHP 中 define() 和 const 定义常量时的区别

    自 PHP 5.3.0 起,有两种方式定义常量,使用 const 关键字或者 define() 函数:   1 2 const FOO = 'BAR'; define('FOO', 'BAR'); 这 ...

  7. const define 定义常量的区别

    1.用const定义常量在编译的时候,提供了类型安全检查,而define 只是简单地进行字符串的替换 2.const定义的常量,会分配相应的内存空间.而define没有分配空间,只是在程序中与处理的时 ...

  8. const和define的使用区别

    在PHP中(PHP 4及以后),我们可以使用函数define()来定义常量,例如: <?php define('PI',3.14159);  //定义一个名为PI的常量 echo PI;     ...

  9. Unity C# const与static readonly的区别与联系

    using System; namespace Test { class MainClass { //懒人写法的单例 class Weapon { public static readonly Wea ...

随机推荐

  1. CVPR 2020 三篇有趣的论文解读

    作者 | 文永亮 学校 | 哈尔滨工业大学(深圳) 研究方向 | 视频预测.时空序列预测 目录 AdderNet - 其实不需要这么多乘法 Deep Snake for Real-Time Insta ...

  2. HTML5&CCS3(3)基本HTML结构

    3.1 开始编写网页 每个HTML文档都应该包含以下基本成分: DOCTYPE: html元素(包含lang属性.该属性不是必需的,但推荐加上): head元素: 说明字符编码的meta元素: tit ...

  3. golang sms阿里云发送短信(公司实际项目)

    话不多说,直接上代码!!! 要先下载两个包 (可以go get -u +你想要的包) github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests githu ...

  4. vscode使用cnpm报错

     1.在wind10搜索框里输入 Windows PowerShell 进入这个界面 2.打开Windows PowerShell 之后 输入命令:set-ExecutjionPolicy Remot ...

  5. tesseract的简单使用

    Tesseract 是一个开源的 OCR 引擎,可以识别多种格式的图像文件并将其转换成文本,最初由 HP 公司开发,后来由 Google 维护.下载地址:https://digi.bib.uni-ma ...

  6. Fiddler5 发送HTTP请求

    1.Fiddler Composer发送HTTP请求 Composer的编辑模式主要有2种:Parsed模式和Raw模式. 实例1:Composer发送get请求 实例2:Composer发送post ...

  7. 【Springboot】用Prometheus+Grafana监控Springboot应用

    1 简介 项目越做越发觉得,任何一个系统上线,运维监控都太重要了.关于Springboot微服务的监控,之前写过[Springboot]用Springboot Admin监控你的微服务应用,这个方案可 ...

  8. [BJDCTF 2nd]fake google

    [BJDCTF 2nd]fake google 进入页面: 试了几下发现输入xxx,一般会按的格式显示, P3's girlfirend is : xxxxx 然后猜测会不会执行代码,发现可以执行 & ...

  9. Web_jQuery

    第1章: jQuery简介 为了简化 JavaScript 的开发,一些 JavsScript 库诞生了. JavaScript库封装了很多预定义的对象和实用函数,简化HTML与JavaScript之 ...

  10. android 练习效果(界面一)