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

时间: 2024-11-10 14:52:54

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

Js放到HTML文件中的哪个位置有什么区别

这个问题一直是初学者的困惑.先明白js能放在HTML的那个位置,分别是head和body中.大部分人都是放到head里面的.我学的时候也是稀里糊涂的跟着放到head的里面,也不知道为什么?今天看说说,放到这两个地方的区别: 先看一段html代码: 复制代码 代码如下: <html> <head> <title> New Document </title> <meta http-equiv="content-type" content

iOS const和#define常量的区别

(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有具体的类型,在编译阶段会执行类型检查. (3) 存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存. const常量会在内存中分配(可以是堆中也可以是栈中). (4)const  可以节省空间,避免不必要的内存分配. 例如:          #define PI 3

const和宏定义的区别!!!

宏的命名规范:一般以项目前缀开头,key结尾. #开头表编译. 宏的用法:1.定义常用字符串. 2.定义一段代码. const与宏的区别:1.编译时刻:宏-预编译    const-command+b(编译阶段)编译. 2.宏不会检查代码错误,只是替换,但是const会编译报错. 3.宏的好处:定义代码或字符串.方法.参数 const不能.  坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换. const作用:限制类型 1.const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)

JavaScript中const、var和let区别浅析

在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. const b = 2;//正确 // const b;//错误,必须初始化 console.log('函数外const定义b:' + b);//有输出值 // b = 5; // console.log('函数外修改const定义b:' + b);//无法输出 2.var定义的变量可以修改,

const和define的使用区别

在PHP中(PHP 4及以后),我们可以使用函数define()来定义常量,例如: <?php define('PI',3.14159);  //定义一个名为PI的常量 echo PI;    //输出:3.14159 ?> 不过,在PHP 5.3.0之后,除了使用函数define()之外,我们还可以使用PHP关键字const来定义常量,例如: <?php //以下代码需在PHP 5.3.0及之后的版本中运行 const PI =3.14159;//使用const关键字定义一个名为PI的

JavaScript 中const、var、let 区别和使用

前言 我们对JS并不陌生,在使用JS的过程中.我们常常会使用var.const.Let声明变量. 以下总结这三者的区别以及使用的场景. 1.Const const定义的变量是不可以修改的,并且需要注意的是必须初始化.示例代码如下: const a = 1; console.log('函数外const定义a:'+a);//输出有值 a = 2 console.log('函数外修改const定义a:'+a);//输出报错 2.var var 定义的变量是可以修改的,如果不初始化会输出undefine

define宏定义和const常量定义之间的区别

宏:通常把是把一些常用字符串,基本便离开定义宏 1.编译时刻不同:const是在编译的时候编译,宏是在预编译的时候编译(预编译就是程序加载的时候,xcode上面会有一个进度条,显示进度,这个时候其实就是在预编译) 2.编译检测:const有编译检测,而宏没有编译检测 3.宏的好处:可以定义方法和函数 4.宏的弊端:大量使用宏,会导致预编译时间过长 const的作用 1.const仅仅是用来修饰右边变量(基本变量,指针变量) 2.被const修饰的变量只读 例如: 加上const之后,a为只读,不

宏定义、const变量、枚举的区别

1.宏定义是在预处理阶段进行展开:cnost变量是在编译运行阶段使用 2.宏定义没有类型,不做任何类型检查,仅仅是进行展开:const修饰的变量具有具体的类型,编译阶段执行检查 3.宏定义在文件中有多少次就展开多少次,不会分配内存空间:const修饰的变量会在内存中分配空间 1.枚举属于常量:但宏定义不是常量 2.枚举常量是实体的一种:但宏定义不是实体 3.枚举具有类型,但宏定义没有类型,枚举与普通变量有作用域和值,但宏定义没有,它是一种预处理替换

JS中const、var和let区别

在JavaScript中有三种声明变量的方式:var.let.const. 1.const 声明创建一个只读的常量.这不意味着常量指向的值不可变,而是变量标识符的值只能赋值一次,必须初始化. const b = 2;//正确 // const b;//错误,必须初始化 console.log('函数外const定义b:' + b);//有输出值 // b = 5; // console.log('函数外修改const定义b:' + b);//无法输出 2.var 语句用于声明变量. var a;