新手对c++中const的疑问

开源中国门卫大哥 发布于 2014/07/08 08:48
阅读 1K+
收藏 0

我对const的理解是一旦赋值了,就不能修改了。但是写了个demo却不是我想象中的那样。

#include <stdio.h>

#include <stdlib.h>

int main(void) {
        string t = "Hello World!!!";
        const string &s = t;
        t = "no";
        cout<<t<<endl;
        cout<<s<<endl;
        return 0;

}

难道const只是不让自己修改?别人随意改?

加载中
1
andy_han
andy_han

const修饰的是引用,引用实际上就是一个别名指向相同的地址。

调试下就清楚了,可以用下边的代码打印t和s的地址:

printf("&t:0x%x, &s:0x%x\n",&t, &s);

可以看到t和s的地址是相同的,实际指向的都是同一块内存,我的机子上的地址是0x22ff20。

对于t来讲,这个地址后面的内存存储的是string对象结构体,如果用指针来表示的话就是(std::string *) 0x22ff20。

对于s来讲,该地址后面的内存存储的也是string对象结构,但是加了一个限定符const,如果用指针表示的话就是(const std::string *) 0x22ff20。

限定符的意思就是对于s来讲,这个地址的这块内存是只读的。对于这个语句

t = "no";

你是以(std::string *) 类型操作该内存,所以可以修改。如果你要用下面的语句

s = "no";
编译器会报错,这是因为你是以( const std::string *)类型操作该内存,你的s的声明明确了该块内存是只读的,所以编译通不过。

const引用的使用只是明确表明:保证不会通过此引用间接的改变被引用的对象。

0
行者无疆在杭州
行者无疆在杭州
 string t = "Hello World!!!"; 
对象 t 不是const类型, const string t =  "Hello World!!!"; 才是。
0
v
vhrers
const限定了s无法被修改而已,t并不是const类型
q
quaws
关键还是引用的原因,导致s只是t的别名而已。 const作用于s身上,但是不会影响t。 最终t的修改就是s的修改,但是不能直接修改s。
开源中国门卫大哥
开源中国门卫大哥
但是身为const的s却被别人修改了啊。
0
尹绵绵
尹绵绵

这里const修饰的s是string &类型

这个类型记录的实际上是一个string类型的地址,你修改t的内容和这个地址是没有关系的

0
麻伶毅
const string &s=t;//说明s是一个指向常量的指针,意思就是通过指针变量s不能修改常量t的内容;这里面指针变量s是一个常量,它指向一个指定的区域;不能修改它的指向,但是通过t可以自己修改;希望能够帮助你。。
0
askyhml
askyhml
const 只针对定义变量吧,不针对其他变量吧
0
微笑不知慌张
微笑不知慌张
这完全是自己把自己绕晕了,结果出不来了~~哈哈哈
0
g
gdq0915
const 仅仅是说明改变量对所存储活指向的内容的权限是 read only.
0
Force武装卫队
Force武装卫队

const 指针 const 变量 const引用,话说 指针 引用的const了 指针表示的值可以改变的,

如 char str[]="hello world\0"; //str表示数组的首地址,事实上可以 str表示字符串是可以更改的,str 是const,编译器的时候就处理了。如果无需更改,可以用const char* str="hello world\0";这个一般情况下等价。

不过还有const_cast的关键字可以去除const,string有个c_str()获得const char*,

main函数

int main(int argc,char argv[][]);也有的int main(int argc, const char *argv[]);

const修饰指针指针不能更改 修饰变量 变量不能更改。

返回顶部
顶部