C + +分配一个int值的结构?有关构造函数和运算符重载的问题

时间:2018-10-23 04:40:24

标签: c++ struct constructor overloading operator-keyword

当我了解其他人的代码时,我在项目中遇到一个问题,我发现了一种怪异的方式来将int值分配给一个结构:

TestStruct ts = TestStruct(3004);

在Teststruct中,还有另一个子结构SS。 SS只有一个int类型的成员。 (当然,原始代码与下面的代码不同)。 我试图在Windows平台上的vs代码中理解这一点。 下面的代码类似于我的项目之一

我的问题是:

  1. 这怎么可能?为结构分配一个int值(在我的项目中,其他同事的代码已经使用了它)。
  

---更新:现在我知道这里使用的方式称为转换   构造函数。 int-> struct-> int,对吗?

  1. 如何理解构造函数重载和运算符重载?我对以下&,&&和默认值感到困惑...(在源代码中,每个结构都具有以下相似的代码:)

TestStruct() = default;
TestStruct(const TestStruct&) = default;
TestStruct& operator=(const TestStruct&) = default;
TestStruct(TestStruct&&) = default;
TestStruct& operator=(TestStruct&&) = default;


测试代码如下:

// 03_2 struct constructor.cpp 
#include <iostream>
using namespace std;

typedef struct subStruct {
    int si;
    subStruct(const int si_) : si(si_){   //compile error if no this constructor
    }
}SS;

struct TestStruct {
    SS  ss; 

    //constructor and operator overload
    TestStruct(const SS ss_)  : ss(ss_) {

    }

    TestStruct() = default;
    TestStruct(const TestStruct&) = default;
    TestStruct& operator=(const TestStruct&) = default;
    TestStruct(TestStruct&&) = default;
    TestStruct& operator=(TestStruct&&) = default;
};

int main(int argc, char const *argv[])
{
    TestStruct ts = TestStruct(3004);

    return 0;
}

2 个答案:

答案 0 :(得分:3)

  

这怎么可能?将一个int值分配给一个结构

您为struct提供了一个int的构造函数:

struct SS {
    int si;
    SS(int si) : si{ si } {}
};

因此int文字

TestStruct ts = TestStruct(3004);

可以转换为SS,并传递给您

TestStruct(const SS ss_) : ss(ss_) {}

答案 1 :(得分:0)

为了完整起见,如果“结构”是聚合的,则可以简单地使用括号初始化:

struct SS {                                 
    int si;                                 
};                                          

struct TestStruct {                         
    SS  ss;                                 
};                                          

int main()                                  
{                                           
    TestStruct ts = TestStruct{3004};       
}