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

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


当前回答

在c++中,struct和class都是相等的,除了struct的默认成员访问说明符是public和class有private。

在c++中使用struct的原因是c++是C的超集,必须向后兼容遗留的C类型。

例如,如果语言用户试图在他的c++代码中包含一些C头文件legacy-c.h,它包含struct Test {int x,y};struct Test的成员应该像C一样可以访问。

其他回答

在c++中,struct和c++类只有一个区别,默认情况下,struct成员是public,类成员是private。

/*Here, C++ program constructor in struct*/ 
#include <iostream>
using namespace std;

struct hello
    {
    public:     //by default also it is public
        hello();    
        ~hello();
    };

hello::hello()
    {
    cout<<"calling constructor...!"<<endl;
    }

hello::~hello()
    {
    cout<<"calling destructor...!"<<endl;
    }

int main()
{
hello obj;      //creating a hello obj, calling hello constructor and destructor 

return 0;
}

是的,在结构中有构造函数是可能的,这里有一个例子:

#include<iostream.h> 
struct a {
  int x;
  a(){x=100;}
};

int main() {
  struct a a1;
  getch();
}
struct HaveSome
{
   int fun;
   HaveSome()
   {
      fun = 69;
   }
};

我宁愿在构造函数中初始化,这样就不需要保持顺序。

再举一个在构造函数中设置值时使用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编译。

以上所有答案都严格地回答了提问者的问题,但我只是想指出一个可能会遇到问题的情况。

如果你像这样声明你的结构体:

typedef struct{
int x;
foo(){};
} foo;

在尝试声明构造函数时会遇到问题。当然,这是因为你实际上并没有声明一个名为“foo”的结构体,你创建了一个匿名结构体,并给它分配了别名“foo”。这也意味着你不能在cpp文件中使用"foo"和作用域操作符:

foo。:

typedef struct{
int x;
void myFunc(int y);
} foo;

foo.cpp:

//<-- This will not work because the struct "foo" was never declared.
void foo::myFunc(int y)
{
  //do something...
}

要解决这个问题,你必须这样做:

struct foo{
int x;
foo(){};
};

或:

typedef struct foo{
int x;
foo(){};
} foo;

后者创建了一个名为“foo”的结构体,并赋予其别名“foo”,因此在引用它时不必使用struct关键字。