代码如下
#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指针可以改,所以没错
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错
#3
请问怎么才可以保证安全?既然顶层也可以赋值给底层,那有没有底层和顶层这个概念之分就没必要了呀?
#4
我也这么觉得,这样感觉没必要分为什么底层和顶层了,就这里书上看了好久,没明白这两种概念存在的意义。
#5
找个英文的对照一下,应该是没理解好
#6
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
#7
第一次听说底层跟顶层的概念啊,难道跟什么深拷贝浅拷贝一个类型的东西???
#8
没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错
我也这么觉得,这样感觉没必要分为什么底层和顶层了,就这里书上看了好久,没明白这两种概念存在的意义。
找个英文的对照一下,应该是没理解好
我刚刚看了英文的,英文的也是一个意思。应该是书的问题,原版也没有表述清楚。刚刚也看了一个博客,人家编译时,左值是底层const时,右值既可以是非const,也可以是底层const,顶层const。
http://blog.csdn.net/CXHPLY/article/details/49470707
#9
第一次听说底层跟顶层的概念啊,难道跟什么深拷贝浅拷贝一个类型的东西???
应该不是一个意思。你可以看看人家的博客http://blog.csdn.net/CXHPLY/article/details/49470707 就当了解一点额外知识呗。
#10
刚刚看了下,底层跟顶层,就是直接间接之分
一个指的是 某符号 是常量。
一个指的是 某符号关联的对象(指针所指,引用所引用)是常量。
其实,C++引用本身,相当于常量,因为 一旦初始化,就不能再改成引用别的对象了。
但是引用由于 别名语义,
它可以代表所引用的对象。
该 对象对于 此引用是否常量,由 此引用的定义来确定。
const 引用只是表示,引用的对象 是常量,
引用本身,由于 C++不允许更换所引用的对象,本质上总是常量。
因此,也就无须讨论,常量与否了
一个指的是 某符号 是常量。
一个指的是 某符号关联的对象(指针所指,引用所引用)是常量。
其实,C++引用本身,相当于常量,因为 一旦初始化,就不能再改成引用别的对象了。
但是引用由于 别名语义,
它可以代表所引用的对象。
该 对象对于 此引用是否常量,由 此引用的定义来确定。
const 引用只是表示,引用的对象 是常量,
引用本身,由于 C++不允许更换所引用的对象,本质上总是常量。
因此,也就无须讨论,常量与否了
#11
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怪书烂。。。。。
楼主你可以这么理解,
你先把顶层const分开来看
顶层指的是指针本身,底层指的是const指向的对象
p1顶层是cosnt,底层是非const
p2顶层是非const,底层是const
说拷贝时要具有相同的底层const资格,或者可以将非常量转换成常量,
这不就很清楚了吗
p1底层是非常量,赋值给p2的底层const。
然后会出现什么情况呢?
不能通过p2修改i的值,但是可以将p2指向其他变量,
不能将p1指向其他变量,但是可以通过p1修改i的值。
如果你是将底层常量付给底层非常量,编译器就会报错了。
比如p1 = p2; // 这样就会报错。
楼上一群人不好好看书,还瞎JB怪书烂。。。。。
#14
楼上都是些什么啊。。。
楼主你可以这么理解,
你先把顶层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指针可以改,所以没错
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错
#2
#3
http://blog.csdn.net/kturing/article/details/45008359
只要能保证安全,就可以转换,也就是说只要转换后的能保证得更多那么这个转换是可以进行的
请问怎么才可以保证安全?既然顶层也可以赋值给底层,那有没有底层和顶层这个概念之分就没必要了呀?
#4
没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错
我也这么觉得,这样感觉没必要分为什么底层和顶层了,就这里书上看了好久,没明白这两种概念存在的意义。
#5
没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错
我也这么觉得,这样感觉没必要分为什么底层和顶层了,就这里书上看了好久,没明白这两种概念存在的意义。
找个英文的对照一下,应该是没理解好
#6
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
#7
第一次听说底层跟顶层的概念啊,难道跟什么深拷贝浅拷贝一个类型的东西???
#8
没听过 “顶层 底层”这种东西
const int *p2
p2指向的内容不能改,p2指针可以改,所以没错
我也这么觉得,这样感觉没必要分为什么底层和顶层了,就这里书上看了好久,没明白这两种概念存在的意义。
找个英文的对照一下,应该是没理解好
我刚刚看了英文的,英文的也是一个意思。应该是书的问题,原版也没有表述清楚。刚刚也看了一个博客,人家编译时,左值是底层const时,右值既可以是非const,也可以是底层const,顶层const。
http://blog.csdn.net/CXHPLY/article/details/49470707
#9
第一次听说底层跟顶层的概念啊,难道跟什么深拷贝浅拷贝一个类型的东西???
应该不是一个意思。你可以看看人家的博客http://blog.csdn.net/CXHPLY/article/details/49470707 就当了解一点额外知识呗。
#10
刚刚看了下,底层跟顶层,就是直接间接之分
一个指的是 某符号 是常量。
一个指的是 某符号关联的对象(指针所指,引用所引用)是常量。
其实,C++引用本身,相当于常量,因为 一旦初始化,就不能再改成引用别的对象了。
但是引用由于 别名语义,
它可以代表所引用的对象。
该 对象对于 此引用是否常量,由 此引用的定义来确定。
const 引用只是表示,引用的对象 是常量,
引用本身,由于 C++不允许更换所引用的对象,本质上总是常量。
因此,也就无须讨论,常量与否了
一个指的是 某符号 是常量。
一个指的是 某符号关联的对象(指针所指,引用所引用)是常量。
其实,C++引用本身,相当于常量,因为 一旦初始化,就不能再改成引用别的对象了。
但是引用由于 别名语义,
它可以代表所引用的对象。
该 对象对于 此引用是否常量,由 此引用的定义来确定。
const 引用只是表示,引用的对象 是常量,
引用本身,由于 C++不允许更换所引用的对象,本质上总是常量。
因此,也就无须讨论,常量与否了
#11
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怪书烂。。。。。
楼主你可以这么理解,
你先把顶层const分开来看
顶层指的是指针本身,底层指的是const指向的对象
p1顶层是cosnt,底层是非const
p2顶层是非const,底层是const
说拷贝时要具有相同的底层const资格,或者可以将非常量转换成常量,
这不就很清楚了吗
p1底层是非常量,赋值给p2的底层const。
然后会出现什么情况呢?
不能通过p2修改i的值,但是可以将p2指向其他变量,
不能将p1指向其他变量,但是可以通过p1修改i的值。
如果你是将底层常量付给底层非常量,编译器就会报错了。
比如p1 = p2; // 这样就会报错。
楼上一群人不好好看书,还瞎JB怪书烂。。。。。
#14
楼上都是些什么啊。。。
楼主你可以这么理解,
你先把顶层const分开来看
顶层指的是指针本身,底层指的是const指向的对象
p1顶层是cosnt,底层是非const
p2顶层是非const,底层是const
说拷贝时要具有相同的底层const资格,或者可以将非常量转换成常量,
这不就很清楚了吗
p1底层是非常量,赋值给p2的底层const。
然后会出现什么情况呢?
不能通过p2修改i的值,但是可以将p2指向其他变量,
不能将p1指向其他变量,但是可以通过p1修改i的值。
如果你是将底层常量付给底层非常量,编译器就会报错了。
比如p1 = p2; // 这样就会报错。
楼上一群人不好好看书,还瞎JB怪书烂。。。。。