Struct Constructor in C++?

C++StructConstructor

C++ Problem Overview


Can a struct have a constructor in C++?

I have been trying to solve this problem but I am not getting the syntax.

C++ Solutions


Solution 1 - C++

In C++ the only difference between a class and a struct is that members and base classes are private by default in classes, whereas they are public by default in structs.

So structs can have constructors, and the syntax is the same as for classes.

Solution 2 - C++

struct TestStruct {
        int id;
        TestStruct() : id(42)
        {
        }
};

Solution 3 - C++

All the above answers technically answer the asker's question, but just thought I'd point out a case where you might encounter problems.

If you declare your struct like this:

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

You will have problems trying to declare a constructor. This is of course because you haven't actually declared a struct named "foo", you've created an anonymous struct and assigned it the alias "foo". This also means you will not be able to use "foo" with a scoping operator in a cpp file:

foo.h:

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...
}

To fix this, you must either do this:

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

or this:

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

Where the latter creates a struct called "foo" and gives it the alias "foo" so you don't have to use the struct keyword when referencing it.

Solution 4 - C++

Class, Structure and Union is described in below table in short.

enter image description here

Solution 5 - C++

Yes, but if you have your structure in a union then you cannot. It is the same as a class.

struct Example
{
   unsigned int mTest;
   Example()
   {
   }
};

Unions will not allow constructors in the structs. You can make a constructor on the union though. This question relates to non-trivial constructors in unions.

Solution 6 - C++

As the other answers mention, a struct is basically treated as a class in C++. This allows you to have a constructor which can be used to initialize the struct with default values. Below, the constructor takes sz and b as arguments, and initializes the other variables to some default values.

struct blocknode
{
    unsigned int bsize;
    bool free;
    unsigned char *bptr;
    blocknode *next;
    blocknode *prev;

    blocknode(unsigned int sz, unsigned char *b, bool f = true,
              blocknode *p = 0, blocknode *n = 0) :
              bsize(sz), free(f), bptr(b), prev(p), next(n) {}
};

Usage:

unsigned char *bptr = new unsigned char[1024];
blocknode *fblock = new blocknode(1024, btpr);

Solution 7 - C++

Yes. A structure is just like a class, but defaults to public:, in the class definition and when inheriting:

struct Foo
{
    int bar;

    Foo(void) :
    bar(0)
    {
    }
}

Considering your other question, I would suggest you read through some tutorials. They will answer your questions faster and more complete than we will.

Solution 8 - C++

In c++ struct and c++ class have only one difference by default struct members are public and class members are 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;
}

Solution 9 - C++

struct HaveSome
{
   int fun;
   HaveSome()
   {
      fun = 69;
   }
};

I'd rather initialize inside the constructor so I don't need to keep the order.

Solution 10 - C++

Note that there is one interesting difference (at least with the MS C++ compiler):


If you have a plain vanilla struct like this

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

then somewhere else you might initialize an array of such objects like this:

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

however, as soon as you add a user-defined constructor to MyStruct such as the ones discussed above, you'd get an error like this:

> 'MyStruct' : Types with user defined constructors are not aggregate > : error C2552: '_pointList' : non-aggregates cannot > be initialized with initializer list.

So that's at least one other difference between a struct and a class. This kind of initialization may not be good OO practice, but it appears all over the place in the legacy WinSDK c++ code that I support. Just so you know...

Solution 11 - C++

Syntax is as same as of class in C++. If you aware of creating constructor in c++ then it is same in struct.

struct Date
{
	int day;

	Date(int d)
	{
		day = d;
	}

	void printDay()
	{
		cout << "day " << day << endl;
	}
};

Struct can have all things as class in c++. As earlier said difference is only that by default C++ member have private access but in struct it is public.But as per programming consideration Use the struct keyword for data-only structures. Use the class keyword for objects that have both data and functions.

Solution 12 - C++

One more example but using this keyword when setting value in constructor:

#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;
}

Compiled with GCC 8.1.0.

Solution 13 - C++

Yes structures and classes in C++ are the same except that structures members are public by default whereas classes members are private by default. Anything you can do in a class you should be able to do in a structure.

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

Solution 14 - C++

Yes it possible to have constructor in structure here is one example:

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

int main() {
  struct a a1;
  getch();
}

Solution 15 - C++

In C++ both struct & class are equal except struct'sdefault member access specifier is public & class has private.

The reason for having struct in C++ is C++ is a superset of C and must have backward compatible with legacy C types.

For example if the language user tries to include some C header file legacy-c.h in his C++ code & it contains struct Test {int x,y};. Members of struct Test should be accessible as like C.

Solution 16 - C++

In C++, we can declare/define the structure just like class and have the constructors/destructors for the Structures and have variables/functions defined in it. The only difference is the default scope of the variables/functions defined. Other than the above difference, mostly you should be able to imitate the functionality of class using structs.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJayView Question on Stackoverflow
Solution 1 - C++sthView Answer on Stackoverflow
Solution 2 - C++nosView Answer on Stackoverflow
Solution 3 - C++gitarooLegendView Answer on Stackoverflow
Solution 4 - C++Saurabh RaootView Answer on Stackoverflow
Solution 5 - C++ChapView Answer on Stackoverflow
Solution 6 - C++LuqmaanView Answer on Stackoverflow
Solution 7 - C++GManNickGView Answer on Stackoverflow
Solution 8 - C++KulamaniView Answer on Stackoverflow
Solution 9 - C++SwDevMan81View Answer on Stackoverflow
Solution 10 - C++Steve LView Answer on Stackoverflow
Solution 11 - C++sitaram chhimpaView Answer on Stackoverflow
Solution 12 - C++Luka LopusinaView Answer on Stackoverflow
Solution 13 - C++heavydView Answer on Stackoverflow
Solution 14 - C++Rajesh ThakurView Answer on Stackoverflow
Solution 15 - C++Arunprasad RajkumarView Answer on Stackoverflow
Solution 16 - C++Roopesh MajetiView Answer on Stackoverflow