为什么把非const值赋给const变量是合法的,反之则是非法的???

lovesi3344 2009-10-30 10:29:48
看到《c++ primer plus》第八章 函数探幽中函数重载中的一句话
非const值不就是变量吗,const变量不是常量吗?为什么非const值可以赋给const变量?而反之就是非法的

初学c++,请多多指教
...全文
2915 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
逸学堂 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 steedhorse 的回复:]
一个名字加上“const”修饰,表示你不能通过这个名字去修改它所表示的数据实体,否则表示可以修改。
这样理解,随便把一个实体用const修饰一下当然都是没问题的,反之则不可。即const可以随便加上,不能随便去掉。
[/Quote]
好多星星
arong1234 2009-10-30
  • 打赏
  • 举报
回复
“赋值给const变量”这种说法有点欠妥,const变量只能初始化,不能赋值,也许这是为什么你迷糊的原因
[Quote=引用 6 楼 lovesi3344 的回复:]
我是楼主,原文是这样说的:“把const值赋给const变量是合法的,但反之则是非法的”
比如函数声明
    function1(const char*assign1);
    function1(char*assign2);//函数重载
    function2(const char*assign3);
然后文章说,function1只能与非const的调用匹配,而function2可与const或非const的函数调用匹配。
[/Quote]
taodm 2009-10-30
  • 打赏
  • 举报
回复
其实就是“规定”
lovesi3344 2009-10-30
  • 打赏
  • 举报
回复
我是楼主,原文是这样说的:“把const值赋给const变量是合法的,但反之则是非法的”
比如函数声明
function1(const char*assign1);
function1(char*assign2);//函数重载
function2(const char*assign3);
然后文章说,function1只能与非const的调用匹配,而function2可与const或非const的函数调用匹配。
晨星 2009-10-30
  • 打赏
  • 举报
回复
一个名字加上“const”修饰,表示你不能通过这个名字去修改它所表示的数据实体,否则表示可以修改。
这样理解,随便把一个实体用const修饰一下当然都是没问题的,反之则不可。即const可以随便加上,不能随便去掉。
wolflion 2009-10-30
  • 打赏
  • 举报
回复
我觉得应该好好理理"常量"与"常值"的关系,呵呵.
arong1234 2009-10-30
  • 打赏
  • 举报
回复
我感觉你说反了

const int i =3;
int j =4;
i=j; //非法
j=i ;//合法


[Quote=引用 2 楼 lovesi3344 的回复:]
引用 1 楼 adventurelw 的回复:
因为不改变非const数据不违法,但是改变const数据违法。

把非const值赋给const变量不就是改变了const数据吗?这样违法了?
[/Quote]
lovesi3344 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 adventurelw 的回复:]
因为不改变非const数据不违法,但是改变const数据违法。
[/Quote]
把非const值赋给const变量不就是改变了const数据吗?这样违法了?
adventurelw 2009-10-30
  • 打赏
  • 举报
回复
因为不改变非const数据不违法,但是改变const数据违法。
xypi20 2009-10-30
  • 打赏
  • 举报
回复
const 保护成员 不可修改
wangyang327329 2009-10-30
  • 打赏
  • 举报
回复
使用const修饰对象,就好好像对编译器说:“喔,我以后不会改变这个对象”,所以不能给对象直接赋值;
而没有const修饰的对像则表明,以后可能会改变这个对象。
super_chris 2009-10-30
  • 打赏
  • 举报
回复
const type* pointer;
这种定义方式的话,是不能通过pointer去修改所指内容,而pointer本身是可以修改的。
如果想让pointer不能修改,即不许它指向其它对象,应:
type* const pointer;
函数调用如果采用值传递,那么是会调用拷贝构造函数构造新对象作为局部形参的。
这里,不管实参是不是const,传进来就构造了新的对象,而这个新的对象带有const性质。
应该是可以用non-const给const赋值,不能用const给non-const赋值。编译器执行这个检查也是出于安全考虑(const的本意)。
Julykey 2009-10-30
  • 打赏
  • 举报
回复
在VC2005下:
#include "stdafx.h"
#include<iostream>
using namespace std;

void f(const int* a){cout<<a<<endl;}

void f(int* a){a++;}

void g(const int* a){cout<<a<<endl;}

int _tmain(int argc, _TCHAR* argv[])
{
int m = 5;
int* i = &m;
const int* j = &m;
f(i);
f(j);
g(i);
g(j);

system("pause");
return 0;
}

输出都正确,为5的地址
Julykey 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 super_chris 的回复:]
LZ你说反了吧。。。
这是我的代码
C/C++ code#include<iostream>usingnamespace std;void f(constint* a){cout<<a<<endl;}void f(int* a){a++;}void g(int* a){a++;}int main()
{int m=5;int* i=&m;constint* j=&m;
f(i);
f(j);
g(i);
g(j);
}
f()的调用没有问题,倒是g()只能接收非const的参数,g(j)会报错。
[/Quote]
你的代码和楼主说的不一样,楼主的function2(const char*assign3); 它的形参为const的。
我觉得function2是肯定可以与const或非const的函数调用匹配,但是function1好像也可以啊
Julykey 2009-10-30
  • 打赏
  • 举报
回复
可以将非const类型理解为低级别的,而const则是高级别的。允许低级向高级匹配,却不能高级向低级匹配。因为非const的值可以改变,而const一旦初始化就不能改变。
CyberLogix 2009-10-30
  • 打赏
  • 举报
回复
刚好说反了,呵呵
super_chris 2009-10-30
  • 打赏
  • 举报
回复
LZ你说反了吧。。。
这是我的代码
#include <iostream>
using namespace std;

void f(const int* a){cout<<a<<endl;}

void f(int* a){a++;}

void g(int* a){a++;}

int main()
{
int m = 5;
int* i = &m;
const int* j = &m;
f(i);
f(j);
g(i);
g(j);
}

f()的调用没有问题,倒是g()只能接收非const的参数,g(j)会报错。
super_chris 2009-10-30
  • 打赏
  • 举报
回复
真的如此?我试试先[Quote=引用 6 楼 lovesi3344 的回复:]
我是楼主,原文是这样说的:“把const值赋给const变量是合法的,但反之则是非法的”
比如函数声明
    function1(const char*assign1);
    function1(char*assign2);//函数重载
    function2(const char*assign3);
然后文章说,function1只能与非const的调用匹配,而function2可与const或非const的函数调用匹配。
[/Quote]

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧