假设我以前有一个叫做Box的课。我有以下构造函数和void函数:
Box::Box (double height, double width, double length)
{
setHeight(height);
setWidth(width);
setLength(length);
}
void Box::setHeight(double h)
{
height = h;
}
稍后在我的main()函数中声明:
Box box1(2.4, 7.1, 5.0);
2.4会变成我盒子的高度吗?
如何?
voidBox :: setHeight(double h)没有返回值,因为它是void函数?那么它将如何设置高度?
答案 0 :(得分:4)
您的Box
类应具有私有变量:
double height_;
double weidth_;
double length_;
setter函数的全部要点是更改私有变量,这些私有变量通常是外部函数无法访问的。这就是为什么要将“ setter”函数包含为类(Box::setHeight
)的原因。因此,即使setHeight
不返回任何值,Box
成员变量也会更改。
假设您还有一个print()
函数,该函数会将值输出到stdout。考虑以下示例:
auto box1 (1., 1., 1.);
box1.setHeight(2.); // this is a void function - does something but will not return anything
box1.print(); // this should print (2, 1, 1) as output
答案 1 :(得分:4)
2.4会变成我盒子的高度吗?怎么样?
是的,2.4将成为存储在Box
对象的成员变量中的高度。
Box::setHeight
是成员函数。它获得对其被调用对象的隐式引用。从构造函数调用时,成员函数获取对正在构造的对象的引用。这就是为什么任务
height = h;
在Box::setHeight
内部,将修改height
对象的Box
成员变量。
我必须添加一个
&
吗?
不。对构造对象的引用是隐式传递的;您无需采取任何行动。
注释1:为了编译代码,Box
需要具有一个名为height
的成员变量。这与构造函数中的height
不同,后者是从调用者传递给构造函数的参数。
注释2:您可以通过使用height
关键字引用成员变量来在构造函数中分配成员变量this
:
this->height = height;
您还可以使用初始化列表来初始化height
:
Box::Box (double height, double width, double length)
: height(height)
, width(width)
, length(length)
{
// The body can be left empty
}
答案 2 :(得分:1)
假设Box
看起来像这样:
class Box {
private:
double height, width, length;
public:
Box(double height, double width, double length);
void setHeight(double h);
void setWidth(double w);
void setLength(double l);
};
然后Box::setHeight
设置类的height
成员。成员函数可以访问类的数据成员以及传入的任何参数,因此该函数无需返回任何内容即可为该成员分配值。