社区
C语言
帖子详情
讨论一下常引用const T& 和引用T&的区别
richielee
2001-10-29 03:07:07
加精
除了 常引用可以接收常数作为被引用对象 之外
是不是有很本质的区别??
...全文
482
18
打赏
收藏
讨论一下常引用const T& 和引用T&的区别
除了 常引用可以接收常数作为被引用对象 之外 是不是有很本质的区别??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
magicblue
2001-10-30
打赏
举报
回复
C++是强类型语言,所以 A &b=1; 这条语句试图用non-const的b引用const的1,结果当然会错。另外我认为gigix说的没错,临时对象必定为常量。a+A(1) = A(1);我想产生了两个临时对象,a+A(1)的结果是一个,保存A(1)的又是另外一个临时对象,并非a+A(1)这个临时对象。
招RD和QA
2001-10-30
打赏
举报
回复
to richielee:
就是这个意思。
krerix
2001-10-29
打赏
举报
回复
gz up
LANDFISH
2001-10-29
打赏
举报
回复
明天再来:)
rockhard
2001-10-29
打赏
举报
回复
关注,明天再来看看!
richielee
2001-10-29
打赏
举报
回复
那是否是因为,如果 编译时中如果需要产生临时对象,其类型应该是const T
即
A &b=1;
只能相当于
const A tmp(1);
A &b=tmp;
而不是编译成我所希望的
A tmp(1);
A &b=tmp;
所以
const A &a=1; 可以通过
而A &b=1; 无法通过呢?
招RD和QA
2001-10-29
打赏
举报
回复
你有点误会,
A &b = 1;
编译器为什么会来迁就你呢?
你再仔细想想你a+1为什么不能通过的原因。
const A tmp(1);
A &b = tmp;
这个肯定不能编译通过,编译器没有这么AI,能够根据你的意图调整为不同的作法。:)
richielee
2001-10-29
打赏
举报
回复
说错了,b不应该是左值
richielee
2001-10-29
打赏
举报
回复
对,const A& b=1可以通过,一开始我也不知道写了什么竟然不能通过,faint
我有和你相同的想法
const A& b = 1;应该相当于
const A tmp(1);
const A& b = tmp;
但是为什么
A &b=1;
不支持生成一个中间对象这种构造方法
即
A tmp(1);
A &b=tmp;
是不是在语义上,b不应该是右值,所以A &b=1;编译无法通过呢?
招RD和QA
2001-10-29
打赏
举报
回复
我觉得gigix的说法有点不妥。
临时对象肯定是右值,这句话仅对build-in type成立,对于user-define type是不成立的。
就以上例,operator+()返回一个临时对象。
a+A(1) = A(1);
但这句话是能通过的,
这也正是为什么对于一个class T来说,其后自增运算符要返回一个const T,而不是一个T
的原因所在。(前自增运算符需返回一个T&)。
招RD和QA
2001-10-29
打赏
举报
回复
a+1;
这行被编译器扩充为
const A tmp(1);
a.operator+(tmp);
所以你的写法不能通过。
正因如此,你的最后一行
const A& b = 1;
相当于
const A tmp(1);
const A& b = tmp;
肯定能通过,你不妨再试试。
gigix
2001-10-29
打赏
举报
回复
你知道,你这里的a+1实际上是:a.operator+(A(1))。编译器自动生成了一个A类型的临时对象。很显然,临时对象必定是又值,必须是const的。所以这里的参数也必须是const的才能接受这个临时对象。
richielee
2001-10-29
打赏
举报
回复
我知道const T&不能改变对象的值,而T&可以
我对这个程序有疑问,希望有一个解释:
class A{
public:
A(int i)
: n(i)
{};
A operator + ( A &a /* 把这里改为 const A &a, 下面a+1就不会出错了 */)
{ return A( n+a.n ); }
private:
int n;
};
void main()
{
int &j=1; //大家都知道,这行会出错
const int &i=1; //这行没有问题,不会出错
A a(1);
(void)( a+1 ); //这行编译出错!为什么上面operator+参数换成了const A&,这行就通过了
const A& b=1; //而这行无论如何不能通过
}
SlaSk
2001-10-29
打赏
举报
回复
moonmhb()的回答是书上的标准。。。当然,仅仅是标准。
招RD和QA
2001-10-29
打赏
举报
回复
拜托,你老兄有点糊涂吧,为什么没有意义呢?
class T;
ostream& operator<<( ostream& out, const T& obj )
{
...
}
上面这段代码不就显示了意义嘛,对于自己的维护还是别人阅读不都是一件好事吗?
难道就为了省打5个字母的时间??
richielee
2001-10-29
打赏
举报
回复
faint,这也是很明显的,
不过对于T为类的情况来说,"接收常数为被引用对象"有什么意义呢?
moonmhb
2001-10-29
打赏
举报
回复
T&可以返回函数中被修改了的参数值,而const T& 却不能
dis_covery
2001-10-29
打赏
举报
回复
the former ,you can't change the value ,but to T &,you can do .
Nodejs详解
const
http = require('http')
const
hostname = '127.0.0.1'
const
port = 3000
const
server = http.createServer((req, res) => { res.statusCode = 200 res.setHeader('Content-...
const
T*& 指针的
引用
、指针的指针、
const
我们用T来表示类型,这里的类型可以是系统内置类型,也可以是用户自定义类型。 我们先来熟悉一下这种表示方法。...同理,
const
T&表示
常
引用
,所
引用
的也是T类型的也是底层
const
,也就是说通过该
引用
,只
C++
const
的使用
在进行讨论之前,先说明
const
是个什么东西。
const
其实是一个语义约束,告诉编译器和其他程序员某值应该保持不变。在程序编译的过程中该约束由编译器保证,如果违反了
const
约束,编译报错。 函数形参数列表 最
常
使用...
c++函数返回
引用
的问题
这两天写Vec时遇见返回
引用
的问题,觉得之前对这个问题的理解不够深入。所以,本文进一步讨论下我对这个问题的理解。 本文参考了[c++函数返回
引用
]一文,此文写的较为清楚,大家...
const
T& operator[]( size_type i
C++
const
函数返回值应为
const
引用
如果我们在
const
函数中返回一个非
const
的
引用
,那么调用者可以通过该
引用
修改对象的状态,这违反了
const
函数的约束。由于返回的是一个
引用
,而不是实际的对象副本,这种方式还能够避免不必要的拷贝操作,提高性能。...
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章