关于常对象的问题

sunshy2 2009-02-21 04:51:53
#include<iostream>
using namespace std;
class A
{
public:
A(int i);
void print();
const int &r;
private:
const int a;
static const int b;
};

const int A::b=10;

A::A(int i):a(i),r(a){}

void A::print()
{
cout<<a<<":"<<b<<":"<<r<<endl;
}
void main()
{
A a1(100),a2(0);
a1.print();
a2.print();
}
为什么把程序把构造函数改为A::A(int i):a(i),r(i){}后运行结果会不同?
本人初学C++,可以说得详细一点吗?
比如为什么更改后r的值会变成一个莫名的值?谢谢
...全文
86 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxbwelcome 2009-02-21
  • 打赏
  • 举报
回复
A::A(int i):a(i),r(a){}
这是一个带有成员初始化列表的构造函数,含义是常成员a取i的值,而a又取了个别名r【引用的本质含义】,输出r的值也就是a的值
而如果改成A::A(int i):a(i),r(i){},r引用的是i【注意i为局部变量,离开了构造函数就不存在了】,所以输出r自然是莫名的值。
speeder53 2009-02-21
  • 打赏
  • 举报
回复
mk
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 operatingtuzi 的回复:]
const int &r; 这是一个常引用,所为引用 就是一个变量的别名,一旦初始化 就始终与那个变量保持一致。
A::A(int i):a(i),r(a){} 这里相当于const int &r=a 其实r的地址和a的地址是一样的,所以他们当然保留同样的值,这里 a的声明期和A的对象一样长。当然r的生命期也是一样


把程序把构造函数改为A::A(int i):a(i),r(i){}之后 r和i的地址是一样的 r是i的别名。但是i只是一个参数,是一个局部变量。当函数调用结束以后,…
[/Quote]
嗯,很细心啊,我看了3分钟都没发现这个问题.
  • 打赏
  • 举报
回复
好诡异啊.
我本以为是因为i作为int型传给const int &r引起的,但是声明里改为int &r;依然如此..
operatingtuzi 2009-02-21
  • 打赏
  • 举报
回复
const int &r; 这是一个常引用,所为引用 就是一个变量的别名,一旦初始化 就始终与那个变量保持一致。
A::A(int i):a(i),r(a){} 这里相当于const int &r=a 其实r的地址和a的地址是一样的,所以他们当然保留同样的值,这里 a的声明期和A的对象一样长。当然r的生命期也是一样



把程序把构造函数改为A::A(int i):a(i),r(i){}之后 r和i的地址是一样的 r是i的别名。但是i只是一个参数,是一个局部变量。当函数调用结束以后,i的值就不一定是什么了。所以 r的值也就改变了
waizqfor 2009-02-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 sunshy2 的帖子:]
#include <iostream>
using namespace std;
class A
{
public:
A(int i);
void print();
const int &r;
private:
const int a;
static const int b;
};

const int A::b=10;

A::A(int i):a(i),r(a){}

void A::print()
{
cout < <a < <":" < <b < <":" < <r < <endl;
}
void main()
{
A a1(100),a2(0);
a1.print();
a2.print();
}
为什么把程序把构造函数改为A::A(int i):a…
[/Quote]
A::A(int i):a(i),r(i){}//LZ这是初始化列表 赋值的时候 r(i)不确定i值是多少 所以需要用a变量来赋值给r
要用i的话 就出现随机数了
arong1234 2009-02-21
  • 打赏
  • 举报
回复
因为r(a)要求a先被初始化,而有时并不能满足一点。你的初始化应该依赖于一个确定不变的值,而不要增加不必要的不确定因素

65,211

社区成员

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

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