成员访问类

时间:2011-10-11 22:06:03

标签: c++ class

一个类定义如下:

class Widget {
  double wgt;
public:
  Widget(double w) : wgt(w) {assert(w>=0);}
  double weight() const { return wgt;}
  double & weight() { return wgt;}

};

为什么它必须包含方法

的两个实现
  

重量

对于第一个,将const置于何处?对于第二个,放置和放置的效果是什么?有?

Widget(double w) : wgt(w) {assert(w>=0);}的代码应该作为构造函数,但是如何在这里理解wgt(w)?

我们可以将此课程用作

Widget w(35);
cout <<w.weight()<<endl;

但我看不清w(35)如何通过定义的构造函数创建对象?

此外,这个w.weight使用了哪个函数权重的实现?

3 个答案:

答案 0 :(得分:1)

const是你和编译器之间的一个契约,说你不会改变对象(在这种情况下,当你试图修改得到的返回值时,编译器会出错。使用&amp;得到你会得到该对象的参考。

Const - &gt;不可变值

&安培; (参考) - &gt; ''对可变值的引用的地址。

答案 1 :(得分:1)

  

Widget的代码(双w):wgt(w){assert(w&gt; = 0);}应该作为构造函数,但是如何在这里理解wgt(w)?

: wgt(w)是此构造函数的初始化列表。例如,请参阅http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6。因此,Widget w(35);会创建并构建w类型Widget的变量wgt,其weight数据成员的初始值为35。

  

为什么必须包含方法wgt的两个实现?

它没有“有”,很多人会说这是不好的形式。提供这两个公共函数并使数据成员const公开之间没有区别。至于为什么两个去:其中一个函数,w.weight() = 42; 限定版本,只能用作右值,一个等号右边的值。非const版本可以用作左值(在等号的左侧)或作为右值。例如,

{{1}}

答案 2 :(得分:0)

对于第一个,const保证调用方法不会更改任何widget对象的成员。

对于第二个,&amp;表示将返回引用而不是wgt成员的副本。因为它是一个参考,你可以通过

来改变wgt的值
Widget w(3.3);
w.weight() = 45.3;

如果&amp;如果不存在,你仍然可以像我的例子中那样编写代码,但是即使在似乎为它分配45.3的行之后,w.wgt仍然会有它的原始值3.3。

构造函数中的wgt(w)意味着在构造对象时,给予类的wgt成员的初始值将是作为参数传递给构造函数的值。

通过将自己的cout打印添加到打印出不同内容的两种方法并查看哪一种打印出来,你可以自己找出w.weight()时调用的函数。