【问题标题】:What is this way of assignment called? myVar(value);这种分配方式叫什么?我的变量(值);
【发布时间】:2015-04-06 12:05:25
【问题描述】:

我正在挖掘其他人的代码,我注意到他通过以下方式分配类的公共/私有成员:

myMemberVar(Value);

而不是

myMemberVal=Value;

我想知道这种分配方式是否正常并且可以真正互换使用。

【问题讨论】:

  • 这根本不是一种“分配”的方式!因此,在没有看到任何上下文的情况下,我们无法说出它是什么
  • 贴一个完整的函数,让我们可以看到上下文。
  • @LightnessRacesinOrbit:你是对的,这不是一个任务。但是说“根本不是”,这也不正确。您无法通过其原型知道方法在内部做什么。所以它可能只是 C# 中已知的一种 geter- / seter- 方法。你知道我的意思? OP 对此(和他的问题)并没有足够清楚。
  • @Zaibis:不,完全正确。标记myMemberVar(value) 永远不能是“分配”。如果它是一个在内部执行一些“设置”操作的函数调用,那么很好,但这不是“赋值”;这是一个函数调用。事实上,从他对我的回答的评论中可以清楚地看出他“关于那个”。 :)
  • @LightnessRacesinOrbit:这就是我所说的,但无论如何它都可以表现得很好。

标签: c++ class assignment-operator


【解决方案1】:

这是构造的语法,而不是赋值。

【讨论】:

  • 除非它在一般情况下缺少类型。所以事实上这不是“用于构造”的语法(你永远不会直接调用构造函数,即使语法有时会误导你认为你可以)。在 best 你可以说语法“声明”,但它甚至不是因为它没有声明符。这是一个简单明了的初始化程序。
【解决方案2】:

您可能正在查看成员初始化列表中的初始化

struct A
{
   int x, y;

   A()
     : x(42)    // <-- here
     , y(12)    // <-- and here
   {}
{};

这些不是“任务”,正如以下是任务:

void foo()
{
   int x = 42;
   int y = 42;
}

但请记住,C++03 初始化语法(与上述令人困惑的、遗留的、看起来像赋值的语法相反)是:

void foo()
{
   int x(42);
   int y(42);
}

更进一步,从 C++11 开始:

void foo()
{
   int x{42};
   int y{42};
}

这就是成员初始化列表中必需的语法。

请注意,这意味着它们通常不可互换:仅在初始化时!通常当你写 = 时你正在执行赋值,这个初始化语法在那里是无效的。


别担心,我还是更喜欢它!

【讨论】:

  • @yaro:请注意,这意味着它们通常不可互换。通常当你写 = 时,你正在执行赋值,而这个初始化语法在那里是无效的。
  • 我认为您的意思是 int x{42}; 作为 真正 现代语法?
【解决方案3】:

代码的第一个 sn-p 没有分配任何东西;它尝试像函数一样调用myMemberVar

也许真正的代码在构造函数的初始化列表中:

MyClass() : myMemberVar(Value) {}

第二个在构造函数体中:

MyClass() {
    myMemberVar = Value;
}

这里的区别是第一个执行直接初始化,而不是赋值;第二个执行默认初始化,然后是赋值。

对于简单类型,两者作用相同,可以认为是可以互换的。对于类类型,它们可能会调用不同的用户定义函数:第一种情况是转换/复制/移动构造函数,第二种情况是默认构造函数后跟赋值运算符。根据这些功能的定义方式,这两个选项可能具有不同的效果或性能特征,并且如果无法访问所需的功能,则可能无法使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多