-3

I am doing C++ from 2 years or so , I say why we need constructors in class and not in structures , and why we cant do constructor overloading in structure...

Lightness Races in Orbit
  • 378,754
  • 76
  • 643
  • 1,055
Shreyan Mehta
  • 550
  • 5
  • 17
  • 9
    The moral of the story is you can't learn `C++` by listening to gossip. You need to get a good book and work methodically through it a few hours a day: https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – Galik Feb 07 '16 at 20:09

2 Answers2

9

why we need constructors in class

We don't.

// Perfectly valid
class Foo
{
public:
    int x
};

why we cant do constructor overloading in structure...

We can.

// Look, ma!
struct Bar
{
   Bar operator+(const Bar& other);
};

I don't know where you heard these claims but it certainly wasn't from trying it out.

A user-defined type declared with the keyword struct is a class.

Community
  • 1
  • 1
Lightness Races in Orbit
  • 378,754
  • 76
  • 643
  • 1,055
  • firstly...thank you for replying so early... case one for that class thing... there is a default constructor which would be invoked implicitly which we can also write as `Foo(){x=0;//or perhaps anything}` ...secondly according to my knowledge we cant do this thing in struct... – Shreyan Mehta Feb 07 '16 at 20:14
  • A struct is a class that has default of public visibility, so saying that "a struct is a class" without qualification is plain false. The code `struct {` is *equivalent* to `class { public:`. – kfsone Feb 07 '16 at 20:15
  • 2
    @kfsone, there is a difference between "syntax" and "semantics" of a programming language. "class" and "struct" behave semantically the same, but you need a different syntax (keyword "public" or "private", resp.) to get the same visibility. – Kijewski Feb 07 '16 at 20:18
  • @Kay that's why they are equivalent not the same. "A struct *is* a class with default public visibility" would be correct, but it's not true to say they are the same. Most compilers have a warning when you pre-declare something as a struct but later define it as a class or vice-versa. They are *not* the same. – kfsone Feb 07 '16 at 20:21
  • 2
    @kfsone, did you read PreferenceBean's answer, the linked one? C++ does not know structs. It has two syntaxes to define classes. – Kijewski Feb 07 '16 at 20:23
  • 2
    @ShreyanMehta: _"secondly according to my knowledge we cant do this thing in struct..."_ Your knowledge is incorrect. Take a moment to try it out. You'll see! (Disclaimer: I can't vouch for what early-1990s Turbo C++ on a DOS emulator will do. We are talking about ISO C++ here.) – Lightness Races in Orbit Feb 07 '16 at 20:31
  • 1
    @kfsone: I didn't say they were the same. I said a "struct" (whatever that is) is actually a class, which is completely true. However, that is not the same as claiming that a program containing the token `struct` is the same as a program containing the token `class` in its place. This is sometimes true, but not always. The key point, however, is that _both_ tokens are used in the declaration and definitions of _classes_. As well as the whole traits thing, the validity of the following makes this crystal clear: `struct Foo; class Foo {};` – Lightness Races in Orbit Feb 07 '16 at 20:31
  • @PreferenceBean With clang -Wall that produces `test.cpp:3:1: warning: 'Foo' defined as a class here but previously declared as a struct [-Wmismatched-tags]`. You're arguing the back-end half of the situation while omitting the important front-end half: the input `struct Foo{` and `class Foo{` are not equivalent. Once you get past the visibility, they are identical. My point is you're throwing out the front-end half of the story in the telling of the back-end. – kfsone Feb 07 '16 at 20:35
2

The only difference between struct and class in C++ is visibility; a struct defaults to public while a class defaults to private.

Once you get past that initial visibility, however, they are indistinguishable. A struct is a class with default public visibility.

These two pieces of code have exactly the same effect.

struct MyClass {
    MyClass(int i) : m_i(i) {}
    int getI() const { return m_i; }
    void setI(int i) { m_i = i; }
private:
    int m_i;
};

// is exactly the same as

class MyClass {
public:
    MyClass(int i) : m_i(i) {}
    int getI() const { return m_i; }
    void setI(int i) { m_i = i; }
private:
    int m_i;
};

or put another way

class MyClass {
    int m_i;
public:
    MyClass(int i) : m_i(i) {}
    int getI() const { return m_i; }
};

struct MyClass {
private:
    int m_i;
public:
    MyClass(int i) : m_i(i) {}
    int getI() const { return m_i; }
};
kfsone
  • 23,617
  • 2
  • 42
  • 74
  • 2
    Please stop spreading [this misleading wording](http://stackoverflow.com/a/34108140/560648). By making "a struct" a thing distinct from "a class", you only propagate the sort of misunderstanding that has led to this very question. – Lightness Races in Orbit Feb 07 '16 at 20:09