-1

我目前正在学习 C++,并且在理解如何为构造函数赋值时遇到了一些问题。让我的锻炼发挥作用,但不确定哪种方式最聪明/最好。方式nr。1

class Vector2d{

public:
Vector2d(double x, double y):x(x),
y(y)
{

}

和方式 nr.2

class Vector2d{

public:
void set_values (double,double);
Vector2d()
{

}

void Vector2d::set_values (double a, double b) {
  x = a;
  y = b;
}

通过阅读一些教程找到了两种方式,两种方式都有效。我想第一个效率更高,因为我不必写一个新的 void,但我不确定是什么

:x(x),
y(y)

正在做/意义。

提前非常感谢!

4

6 回答 6

3

在 C++ 中通过说

:x(x),
y(y)

您将在编译时实际保存指令。当为类腾出空间时,编译器实际上会直接内联初始化这些变量。

所以我会说这种方式更好。

于 2013-03-29T17:02:59.420 回答
2

我不完全确定 [code...] 正在做什么/意味着什么。

他们正在初始化您的成员变量。

这可能会令人困惑,因为您的构造函数参数被赋予了相同的名称。考虑这个等价物:

Vector2d(double x_param, double y_param)
  : x(x_param)  // initialize member variable "x"
  , y(y_param)  // initialize member variable "y"
{

}

你的类同时拥有这个构造set_values函数和在构造后更改值的函数是合理的。

于 2013-03-29T17:02:31.207 回答
1

使用#1,您正在指示程序通过调用其构造函数来初始化 x,y

使用#2,您正在调用 operator= 以通过以下方式覆盖 x,y 的值:通过调用两个构造函数获得的值: x.operator=(double(right_value))

没有太大区别,因为所涉及的类型是“双”,我猜对于一些复杂的类会有很大的不同

于 2013-03-29T17:04:34.543 回答
1

第一种方法是调用构造函数来初始化成员;第二种方法是调用成员函数通过赋值来改变成员变量的值,因为你只定义了默认构造函数,最初成员用默认值初始化,然后如果你调用set_values函数,它们会在函数体内重新赋值。在当前示例中,它们将具有相同的效果。但通常最好在构造函数的初始化列表中初始化成员变量。你的第二种方式看起来像一个setter函数。您不能使用第二种方法来初始化类成员变量,因为它不是静态的。

如果您正在构造一个对象,最好使用第一种方式。使用初始化列表,成员只被创建和初始化一次,具有给定的值。

于 2013-03-29T17:09:44.983 回答
1

创建带有参数的构造函数来初始化类的成员属性(您的第一个解决方案),它不同于默认构造函数(没有参数 - 您的第二个解决方案中的构造函数)。

在您的第二个解决方案中,您正在使用一个 setter(一个成员函数来设置成员属性的值),我们可以在需要设置值的任何时候调用它,但是使用带有参数的构造函数(第一个解决方案),我们只能设置值当我们第一次为该类创建一个对象时。

例如;

当我们创建对象时;

Vector2d vec2d(2.3, 4.5);

它会将 x 和 y 的值分别设置为 2.3 和 4.5,但是如果我们需要在程序中再次设置这些值,我们该怎么办?然后我们将使用 setter 函数,例如;

vec2d.set_values(5.0, 7.8);

所以简而言之,我们只根据我们的场景使用我们需要的东西。如果我们不想再次设置值,那么带参数的构造函数(您的第一个解决方案)是最好的。

我们执行以下操作

:x(x),
y(y)

将通过构造函数中的参数传入的 x 和 y 的值分配给类成员 x 和 y。它是一样的;

class Vector2d{

public:
  Vector2d(double x, double y)
  {
    //"this" pointer is used to differentiate the variables
    this->x = x;
    this->y = y;
  }
}

或者为了简单起见,如果您还不了解this指针,我建议您使用不同的名称;

class Vector2d{

public:
  Vector2d(double a, double b)
  {
    x = a;
    y = b;
  }
}
于 2013-03-29T17:12:13.257 回答
0

如果您将使用单独的函数来初始化您的对象,而不是在构造函数调用和初始化之间,您的对象将处于未初始化状态。

你需要它的唯一情况——当你真正知道你在做什么的时候。

而且在构造函数中初始化也更快。当你写

my_class()
: field_(value)
{
}

您的字段通过复制value到其中进行初始化。在其他情况下,它在复制时初始化,这是开销。

于 2013-03-29T17:03:54.157 回答