c++ OOP哪一种方式给构造函数赋值更好

C++ OOP which way is better to give values to constructor

本文关键字:构造函数 赋值 更好 方式 OOP 哪一种 c++      更新时间:2023-10-16

我目前正在学习c++,在如何给构造函数赋值的理解上有一些问题。我的锻炼开始了,但我不确定哪种方式最聪明/最好。方式1

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

和way n .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)

做/意义。

提前感谢!

在c++中使用

:x(x),
y(y)

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

我不太确定[代码…]的意思。

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

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

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

对于你的类来说,有这个构造函数和set_values函数来改变构造后的值是合理的。

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

在你的第二个解决方案中,你使用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;
  }
}

对于#1,您指示程序通过调用构造函数来初始化x,y

对于#2,您调用operator=将x,y的值覆盖为:调用两个构造函数获得的值:x。operator=(double(right_value))

没有太大的区别,因为所涉及的类型是"double",我猜对于一些复杂的类,

会有很大的不同。

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

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

如果你使用单独的函数来初始化对象,那么在构造函数调用和初始化之间,你的对象将处于初始化状态。

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

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

my_class()
: field_(value)
{
}

通过复制value来初始化您的字段。在另一种情况下,它在复制时初始化,这是开销。