c++中底层const的问题

时间:2022-04-18 00:55:35
c++primer第五版p58中提到了底层const,书上说 当执行对象的拷贝操作时,拷入和拷出的对象都必须具有相同的底层const资格,但是我自己在vs2013上运行时将顶层的const p1赋给了底层p2,编译没有报错,也能运行。难道书上说错了?大神求救。
代码如下
#include <iostream>
using namespace std;

int main()
{
int i = 0;
int *const p1 = &i;//不能改变p1的值,这是一个顶层const
const int ci = 42;//顶层const
const int *p2 = &ci;//能改变p2的值,这是一个底层
const int *const p3 = p2;//p3既是顶层又是底层
const int &r = ci;//声明的引用都是底层

//顶层拷贝对象
i = ci;
p2 = p3;

//底层拷贝对象
//对象之间必须具有相同底层const资格或者两个对象数据类型必须能够转换,即非常量可以转换成常量
//int *p = p3;
p2 = p3;
p2 = &i;//int*可以转换成const int*
//int &r = ci;//普通的int&不能绑定到一个int 常量
p2 = p1;

system("pause");
}

14 个解决方案

#1


没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错

#2


http://blog.csdn.net/kturing/article/details/45008359

只要能保证安全,就可以转换,也就是说只要转换后的能保证得更多那么这个转换是可以进行的

#3


引用 2 楼 paschen 的回复:
http://blog.csdn.net/kturing/article/details/45008359

只要能保证安全,就可以转换,也就是说只要转换后的能保证得更多那么这个转换是可以进行的

请问怎么才可以保证安全?既然顶层也可以赋值给底层,那有没有底层和顶层这个概念之分就没必要了呀?

#4


引用 1 楼 jiht594 的回复:
没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错

我也这么觉得,这样感觉没必要分为什么底层和顶层了,就这里书上看了好久,没明白这两种概念存在的意义。

#5


引用 4 楼 qq_28839621 的回复:
Quote: 引用 1 楼 jiht594 的回复:

没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错

我也这么觉得,这样感觉没必要分为什么底层和顶层了,就这里书上看了好久,没明白这两种概念存在的意义。


找个英文的对照一下,应该是没理解好

#6


不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!

#7


第一次听说底层跟顶层的概念啊,难道跟什么深拷贝浅拷贝一个类型的东西???

#8


引用 5 楼 jiht594 的回复:
Quote: 引用 4 楼 qq_28839621 的回复:

Quote: 引用 1 楼 jiht594 的回复:

没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错

我也这么觉得,这样感觉没必要分为什么底层和顶层了,就这里书上看了好久,没明白这两种概念存在的意义。


找个英文的对照一下,应该是没理解好

我刚刚看了英文的,英文的也是一个意思。应该是书的问题,原版也没有表述清楚。刚刚也看了一个博客,人家编译时,左值是底层const时,右值既可以是非const,也可以是底层const,顶层const。
http://blog.csdn.net/CXHPLY/article/details/49470707

#9


引用 7 楼 u010370871 的回复:
第一次听说底层跟顶层的概念啊,难道跟什么深拷贝浅拷贝一个类型的东西???

应该不是一个意思。你可以看看人家的博客http://blog.csdn.net/CXHPLY/article/details/49470707  就当了解一点额外知识呗。

#10


刚刚看了下,底层跟顶层,就是直接间接之分

一个指的是 某符号 是常量。
一个指的是 某符号关联的对象(指针所指,引用所引用)是常量。

其实,C++引用本身,相当于常量,因为 一旦初始化,就不能再改成引用别的对象了。
但是引用由于 别名语义
它可以代表所引用的对象。
对象对于 此引用是否常量,由 此引用的定义来确定。
const 引用只是表示,引用的对象 是常量,

引用本身,由于 C++不允许更换所引用的对象,本质上总是常量。
因此,也就无须讨论,常量与否了

#11


引用 3 楼 qq_28839621 的回复:
Quote: 引用 2 楼 paschen 的回复:

http://blog.csdn.net/kturing/article/details/45008359

只要能保证安全,就可以转换,也就是说只要转换后的能保证得更多那么这个转换是可以进行的

请问怎么才可以保证安全?既然顶层也可以赋值给底层,那有没有底层和顶层这个概念之分就没必要了呀?


保证安全的意思是被赋值的那个指针“权力”不能比去赋值的指针还多

const int* 你不能赋给int* ,因为int*能做的更多,其他同理,一般不用去考虑那些顶层底层,把自己绕晕

#12


不要看那些垃圾翻译过来的书,这些词我们都没听过不是我们的错,只要能保证拷贝的时候操作是安全的就没问题

#13


楼上都是些什么啊。。。
楼主你可以这么理解,
你先把顶层const分开来看
顶层指的是指针本身,底层指的是const指向的对象

p1顶层是cosnt,底层是非const
p2顶层是非const,底层是const

说拷贝时要具有相同的底层const资格,或者可以将非常量转换成常量,
这不就很清楚了吗
p1底层是非常量,赋值给p2的底层const。

然后会出现什么情况呢?
不能通过p2修改i的值,但是可以将p2指向其他变量,
不能将p1指向其他变量,但是可以通过p1修改i的值。

如果你是将底层常量付给底层非常量,编译器就会报错了。
比如p1 = p2;    // 这样就会报错。

楼上一群人不好好看书,还瞎JB怪书烂。。。。。

#14


引用 13 楼 u013238941 的回复:
楼上都是些什么啊。。。
楼主你可以这么理解,
你先把顶层const分开来看
顶层指的是指针本身,底层指的是const指向的对象

p1顶层是cosnt,底层是非const
p2顶层是非const,底层是const

说拷贝时要具有相同的底层const资格,或者可以将非常量转换成常量,
这不就很清楚了吗
p1底层是非常量,赋值给p2的底层const。

然后会出现什么情况呢?
不能通过p2修改i的值,但是可以将p2指向其他变量,
不能将p1指向其他变量,但是可以通过p1修改i的值。

如果你是将底层常量付给底层非常量,编译器就会报错了。
比如p1 = p2;    // 这样就会报错。

楼上一群人不好好看书,还瞎JB怪书烂。。。。。
说的对啊,楼上那些根本就没看书上怎么写的就乱带节奏

#1


没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错

#2


http://blog.csdn.net/kturing/article/details/45008359

只要能保证安全,就可以转换,也就是说只要转换后的能保证得更多那么这个转换是可以进行的

#3


引用 2 楼 paschen 的回复:
http://blog.csdn.net/kturing/article/details/45008359

只要能保证安全,就可以转换,也就是说只要转换后的能保证得更多那么这个转换是可以进行的

请问怎么才可以保证安全?既然顶层也可以赋值给底层,那有没有底层和顶层这个概念之分就没必要了呀?

#4


引用 1 楼 jiht594 的回复:
没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错

我也这么觉得,这样感觉没必要分为什么底层和顶层了,就这里书上看了好久,没明白这两种概念存在的意义。

#5


引用 4 楼 qq_28839621 的回复:
Quote: 引用 1 楼 jiht594 的回复:

没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错

我也这么觉得,这样感觉没必要分为什么底层和顶层了,就这里书上看了好久,没明白这两种概念存在的意义。


找个英文的对照一下,应该是没理解好

#6


不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!

#7


第一次听说底层跟顶层的概念啊,难道跟什么深拷贝浅拷贝一个类型的东西???

#8


引用 5 楼 jiht594 的回复:
Quote: 引用 4 楼 qq_28839621 的回复:

Quote: 引用 1 楼 jiht594 的回复:

没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错

我也这么觉得,这样感觉没必要分为什么底层和顶层了,就这里书上看了好久,没明白这两种概念存在的意义。


找个英文的对照一下,应该是没理解好

我刚刚看了英文的,英文的也是一个意思。应该是书的问题,原版也没有表述清楚。刚刚也看了一个博客,人家编译时,左值是底层const时,右值既可以是非const,也可以是底层const,顶层const。
http://blog.csdn.net/CXHPLY/article/details/49470707

#9


引用 7 楼 u010370871 的回复:
第一次听说底层跟顶层的概念啊,难道跟什么深拷贝浅拷贝一个类型的东西???

应该不是一个意思。你可以看看人家的博客http://blog.csdn.net/CXHPLY/article/details/49470707  就当了解一点额外知识呗。

#10


刚刚看了下,底层跟顶层,就是直接间接之分

一个指的是 某符号 是常量。
一个指的是 某符号关联的对象(指针所指,引用所引用)是常量。

其实,C++引用本身,相当于常量,因为 一旦初始化,就不能再改成引用别的对象了。
但是引用由于 别名语义
它可以代表所引用的对象。
对象对于 此引用是否常量,由 此引用的定义来确定。
const 引用只是表示,引用的对象 是常量,

引用本身,由于 C++不允许更换所引用的对象,本质上总是常量。
因此,也就无须讨论,常量与否了

#11


引用 3 楼 qq_28839621 的回复:
Quote: 引用 2 楼 paschen 的回复:

http://blog.csdn.net/kturing/article/details/45008359

只要能保证安全,就可以转换,也就是说只要转换后的能保证得更多那么这个转换是可以进行的

请问怎么才可以保证安全?既然顶层也可以赋值给底层,那有没有底层和顶层这个概念之分就没必要了呀?


保证安全的意思是被赋值的那个指针“权力”不能比去赋值的指针还多

const int* 你不能赋给int* ,因为int*能做的更多,其他同理,一般不用去考虑那些顶层底层,把自己绕晕

#12


不要看那些垃圾翻译过来的书,这些词我们都没听过不是我们的错,只要能保证拷贝的时候操作是安全的就没问题

#13


楼上都是些什么啊。。。
楼主你可以这么理解,
你先把顶层const分开来看
顶层指的是指针本身,底层指的是const指向的对象

p1顶层是cosnt,底层是非const
p2顶层是非const,底层是const

说拷贝时要具有相同的底层const资格,或者可以将非常量转换成常量,
这不就很清楚了吗
p1底层是非常量,赋值给p2的底层const。

然后会出现什么情况呢?
不能通过p2修改i的值,但是可以将p2指向其他变量,
不能将p1指向其他变量,但是可以通过p1修改i的值。

如果你是将底层常量付给底层非常量,编译器就会报错了。
比如p1 = p2;    // 这样就会报错。

楼上一群人不好好看书,还瞎JB怪书烂。。。。。

#14


引用 13 楼 u013238941 的回复:
楼上都是些什么啊。。。
楼主你可以这么理解,
你先把顶层const分开来看
顶层指的是指针本身,底层指的是const指向的对象

p1顶层是cosnt,底层是非const
p2顶层是非const,底层是const

说拷贝时要具有相同的底层const资格,或者可以将非常量转换成常量,
这不就很清楚了吗
p1底层是非常量,赋值给p2的底层const。

然后会出现什么情况呢?
不能通过p2修改i的值,但是可以将p2指向其他变量,
不能将p1指向其他变量,但是可以通过p1修改i的值。

如果你是将底层常量付给底层非常量,编译器就会报错了。
比如p1 = p2;    // 这样就会报错。

楼上一群人不好好看书,还瞎JB怪书烂。。。。。
说的对啊,楼上那些根本就没看书上怎么写的就乱带节奏