社区
C语言
帖子详情
讨论一下常引用const T& 和引用T&的区别
richielee
2001-10-29 03:07:07
加精
除了 常引用可以接收常数作为被引用对象 之外
是不是有很本质的区别??
...全文
498
18
打赏
收藏
讨论一下常引用const T& 和引用T&的区别
除了 常引用可以接收常数作为被引用对象 之外 是不是有很本质的区别??
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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 .
c语言
const
程序设计语言.pdf
c语言
const
程序设计语言.pdf
请对C++这些做法说NO
1、好不要使用
引用
返回值 有同学在传递的参数的时候使用
引用
方式传递,避免了临时对象的创建,提高了效率,那么在返回值的时候能不能使用
引用
呢? 看如下代码 class Rational{ public: Raional( int numerator = 0, int denominator =1); … private: int d, d; friend Rational operator* (
const
Rational& lhs,
const
Raional& rhs) ; }; Rational Rational::opera
const
T*& 指针的
引用
、指针的指针、
const
我们用T来表示类型,这里的类型可以是系统内置类型,也可以是用户自定义类型。 我们先来熟悉一下这种表示方法。这样的表示在模板中是很
常
见的。
const
T* 表示指针指向的是一个T类型的变量,该指针具有底层
const
属性,也就是说通过该指针,只能读取指向对象的值,但不能修改其指向对象的值。 同理,
const
T&表示
常
引用
,所
引用
的也是T类型的也是底层
const
,也就是说通过该
引用
,只
【转】现代C++之万能
引用
(T&&)Universal reference(转发
引用
、通用
引用
)、完美转发、
引用
折叠(
引用
坍缩 reference collapsing)返回值优化(NRVO)
(1)在类型声明当中, “&&” 要不就是一个 rvalue reference ,要不就是一个 universal reference – 一种可以解析为lvalue reference或者rvalue reference的
引用
。对于某个被推导的类型T,universal references 总是以 T&& 的形式出现。
const
与&
引用
书上的一个例子 #include class Complex { public: Complex():real(0),imag(0){}; Complex(double r, double i):real(r),imag(i){}; Complex(double r):real(r),imag(0){}; // 定义转换构造函数
C语言
70,024
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章