在c++中,结构可以有构造函数吗?

我一直试图解决这个问题,但我没有得到语法。


当前回答

再举一个在构造函数中设置值时使用this关键字的例子:

#include <iostream>

using namespace std;

struct Node {
    int value;

    Node(int value) {
        this->value = value;
    }

    void print()
    {
        cout << this->value << endl;
    }
};

int main() {
    Node n = Node(10);
    n.print();

    return 0;
}

用GCC 8.1.0编译。

其他回答

在c++中,类和结构之间的唯一区别是,成员和基类在类中默认是私有的,而在结构中默认是公共的。

struct可以有构造函数,语法和类一样。

在c++中,我们可以像类一样声明/定义结构,并拥有结构的构造函数/析构函数,并在其中定义变量/函数。 唯一的区别是定义的变量/函数的默认作用域。 除了上述差异之外,大多数情况下,您应该能够使用结构来模仿类的功能。

再举一个在构造函数中设置值时使用this关键字的例子:

#include <iostream>

using namespace std;

struct Node {
    int value;

    Node(int value) {
        this->value = value;
    }

    void print()
    {
        cout << this->value << endl;
    }
};

int main() {
    Node n = Node(10);
    n.print();

    return 0;
}

用GCC 8.1.0编译。

注意这里有一个有趣的区别(至少在MS c++编译器中):


如果你有一个像这样的普通结构

struct MyStruct {
   int id;
   double x;
   double y;
} MYSTRUCT;

然后在其他地方,你可以初始化一个这样的对象数组:

MYSTRUCT _pointList[] = { 
   { 1, 1.0, 1.0 }, 
   { 2, 1.0, 2.0 }, 
   { 3, 2.0, 1.0 }
};

然而,一旦你添加一个用户定义的构造函数到MyStruct,比如上面讨论的那些,你会得到这样一个错误:

'MyStruct':带有用户定义构造函数的类型不是聚合的 <文件和行>:错误C2552:“_pointList”:非聚合不能 使用初始化列表初始化。

这至少是结构体和类的另一个区别。这种初始化可能不是好的OO实践,但它在我支持的遗留WinSDK c++代码中随处可见。只是想让你知道…

是的,c++中的结构和类是相同的,除了结构成员默认是公共的,而类成员默认是私有的。在类中可以做的任何事情,在结构中也应该可以做。

struct Foo
{
  Foo()
  {
    // Initialize Foo
  }
};