注册 登录
编程论坛 C++教室

这里为什么错了?老师们能否回答一下

junpeng1 发布于 2008-09-10 18:26, 1119 次点击
class example{
private :int& ref;
         const int num;
public:example(int r,int n){ref=r;num=n;}
};
example e(2,8);

这里的构造函数给私有成员赋值的时候,为什么必须用参数表的形式,即example(int r,int n):ref(r),num(n);
我这里怎么就不对啊?


这么做不对的,但是如果变成如下
class example{
private :int ref;
          int num;
public:example(int r,int n){ref=r;num=n;}
};
example e(2,8);
就可以通过编译了
,看来是& ,和const导致的错误,可是不知道为什么

[[it] 本帖最后由 junpeng1 于 2008-9-10 18:33 编辑 [/it]]
14 回复
#2
ailing2008-09-10 18:30
你的应该是对的吧
#3
junpeng12008-09-10 18:31
这里错的
#4
ailing2008-09-10 18:32
参数表是有成员对象时才要用的
#5
blueboy820062008-09-10 18:35
一句话:

必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化列表进行初始化!

#6
junpeng12008-09-10 18:37
4# 大 中 小 发表于 2008-9-10 18:32  只看该作者
参数表是有成员对象时才要用的
这里也没有成员对象啊,但是这里是这么用的

正确的方式应该是
class example{
private :int& ref;
         const int num;
public:example(int r,int n):ref(r),num(=n){};
};
example e(2,8);
还是不太明白,哪位能否清楚一些讲一下
#7
blueboy820062008-09-10 18:38
你想想这个就容易理解了:
const int num=0;
int& ref=a;

在这之后还能改变num 和 ref的值吗?
显然,不能!
再想想,构造函数的作用吧,每次创建对象时都会调用它!...嘿,明白了吧...
#8
ailing2008-09-10 18:41
你的私有成员定义的对吗,我以前怎么没见过象这样定义的
#9
junpeng12008-09-10 18:41
哦,似乎明白了一些,再去想想去,我的破书上面没有,再去找找别的书好好看看!
#10
junpeng12008-09-10 18:42
8# 大 中 小 发表于 2008-9-10 18:41  只看该作者
你的私有成员定义的对吗,我以前怎么没见过象这样定义的

这个就是例题啊
#11
中学者2008-09-10 18:44
规定必须用初始化列表...而我的思考结果是:
举个例,
class A
{
  int &ref_;
  const int i;
  int a,b;
public:
   A(int a_,int b_) {  a=ref_; i=b; b=b_; }
};
假如能够执行,那么这个能保证怎样的语义?我们来看下扩展构造函数:
A::A(int a_,int b_)
{
    this->a=this->ref_;  //很明显,ref_并没有绑定.
    this->i=this->b;  //此时b却没赋值.
    this->b=this->b_;
}
对于第一句可以看出是未定义行为..而第二句却是没意义的.由此可见,如果支持这样的做法,那么引用和常量都不能保证良好的行为.
但是如果必须规定初始化列表,我们来看看(改变下构造函数):
A::A(int a_,int b_):ref_(a_),i(a),b(b_){ a=ref_; }
扩展函数:
A::A(int a_,int b_)
{
   ref_=a_; //  进行绑定.
   i=a; //进行初始化
   b=b_;
  //初始化列表执行完,才是括号内的语句
  a=ref_;  //此时ref_已经绑定过.
}
这样可以保证比第一个更好的行为.....就这么多
#12
ailing2008-09-10 18:59
刚在一个群里问了一下,私有成员是const型和引用的时候,构造函数必须要用初始话列表才行,
#13
ailing2008-09-10 19:02
听了版主的解释更明白了,谢谢版主了
#14
中学者2008-09-10 19:05
回复 13# ailing 的帖子
本人薄见.....仅供参考...
#15
zzt_4282008-09-10 20:41
回复.
const 变量声明时候应该初始化.引用声明的时候也应该初始化.
1