c++ OOP哪一种方式给构造函数赋值更好
C++ OOP which way is better to give values to constructor
我目前正在学习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
来初始化您的字段。在另一种情况下,它在复制时初始化,这是开销。
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++:关于使用 Stroustrup 示例移动构造函数/赋值的问题
- 初始值设定项列表与构造函数赋值与变量定义
- std::vector::emplace() 真的在面对抛出移动构造函数/赋值运算符时提供了强大的异常保证吗?
- 创建一个类并在C++中使用构造函数(赋值)
- 如何为具有自引用指针的类实现复制构造函数/赋值运算符
- 使typedef的构造函数/赋值运算符成为友元函数
- 复制构造函数+赋值运算符
- C++ 矢量从构造函数赋值对象,无需临时
- 具有std::原子成员变量的类的复制构造函数/赋值运算符出错
- 初始化对象时复制构造函数/赋值运算符混淆
- 默认情况下是默认的构造函数/赋值noexcept/constexpr
- 模板是否应该为不同类型的参数制作非 Rvalue 引用构造函数/赋值
- 为什么 std 类型不提供来自分配器不同源的转换构造函数/赋值
- 是否为派生类生成的移动构造函数/赋值运算符
- 复制构造函数/赋值运算符
- C++复制构造函数/赋值运算符错误
- 正在获取要使用的移动构造函数/赋值运算符
- 影响正确性的move构造函数/赋值操作符示例