Programming

C ++의 구조 생성자?

procodes 2020. 3. 5. 08:02
반응형

C ++의 구조 생성자?


structC ++로 생성자를 가질 수 있습니까 ?

이 문제를 해결하려고 노력했지만 구문이 표시되지 않습니다.


C ++에서 a class와 a 의 유일한 차이점은 struct멤버와 기본 클래스는 기본적으로 클래스에서 비공개 인 반면 기본적으로 구조체에서는 공개입니다.

따라서 구조체에는 생성자가있을 수 있으며 구문은 클래스와 동일합니다.


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

위의 모든 답변은 기술적으로 asker의 질문에 대답하지만 문제가 발생할 수 있다고 생각합니다.

구조체를 다음과 같이 선언하면 :

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

생성자를 선언하는 데 문제가 있습니다. 이것은 실제로 "foo"라는 이름의 구조체를 선언하지 않았기 때문에 익명의 구조체를 만들어 별명 "foo"로 할당했습니다. 이것은 또한 cpp 파일에서 범위 연산자와 함께 "foo"를 사용할 수 없음을 의미합니다.

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

이 문제를 해결하려면 다음 중 하나를 수행해야합니다.

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

아니면 이거:

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

후자는 "foo"라는 구조체를 만들고 별칭을 "foo"로 지정하므로 struct참조 할 때 키워드 를 사용할 필요가 없습니다 .


그렇습니다. 그러나 당신이 노조에 구조를 가지고 있다면 당신은 할 수 없습니다. 수업과 같습니다.

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

유니온은 구조체에서 생성자를 허용하지 않습니다. 그래도 유니온에서 생성자를 만들 수 있습니다. 이 질문은 노조의 사소한 생성자와 관련이 있습니다.


다른 답변에서 언급했듯이 구조체는 기본적으로 C ++에서 클래스로 취급됩니다. 이를 통해 구조체를 기본값으로 초기화하는 데 사용할 수있는 생성자를 가질 수 있습니다. 이하, 생성자는 소요 szb인수로, 일부 기본값으로 다른 변수를 초기화한다.

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) {}
};

용법:

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

예. 구조는 클래스와 비슷하지만 public:클래스 정의 및 상속 시 기본값은입니다 .

struct Foo
{
    int bar;

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

다른 질문을 고려할 때 몇 가지 자습서 를 읽는 것이 좋습니다 . 그들은 우리보다 당신의 질문에 더 빠르고 완벽하게 답변 할 것입니다.


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

차라리 생성자 내에서 초기화하므로 순서를 유지할 필요가 없습니다.


예 C ++의 구조와 클래스는 기본적으로 구조 멤버가 공용 인 반면 클래스 멤버는 기본적으로 비공개라는 점을 제외하면 동일합니다. 수업에서 할 수있는 모든 것은 구조에서 할 수 있어야합니다.

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

하나 이상의 흥미로운 차이점이 있습니다 (적어도 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' : Types with user defined constructors are not aggregate
     <file and line> : error C2552: '_pointList' : non-aggregates cannot 
     be initialized with initializer list.

그것은 구조체와 클래스의 적어도 하나의 다른 차이점입니다. 이런 종류의 초기화는 좋은 OO 관행은 아니지만 내가 지원하는 레거시 WinSDK c ++ 코드의 모든 곳에서 나타납니다. 알다시피 ...


클래스, 구조 및 연합은 아래 표에 간략하게 설명되어 있습니다.

여기에 이미지 설명을 입력하십시오


에서 C ++ 구조체C ++ 클래스는 기본 구조체 회원들만 한 차이가 공개되며 클래스 회원은 개인이다.

/*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;
}

C ++에서 모두 struct& class제외하고는 동일한 struct's기본 멤버 액세스 지정자 것은 public및 클래스가있다 private.

structC ++에 있는 이유 는 C ++이기 때문에 C의 상위 집합이므로 이전 버전과 호환 가능해야합니다 legacy C types.

예를 들어 언어 사용자가 legacy-c.h자신의 C ++ 코드에 C 헤더 파일을 포함하려고하면 포함 되어 있습니다 struct Test {int x,y};. struct TestC처럼 멤버에 액세스 할 수 있어야합니다.


예. 여기에 생성자를 구조로 가질 수 있습니다.

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

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

구문은 C ++의 클래스와 동일합니다. C ++에서 생성자를 만드는 것을 알고 있다면 구조체와 동일합니다.

struct Date
{
int day;

Date(int d)
{
    day = d;
}
void printDay()
{
    cout << "day " << day << endl;
}

};

Struct는 모든 것을 C ++의 클래스로 가질 수 있습니다. 앞에서 말했듯이 기본적으로 C ++ 멤버는 기본적으로 개인 액세스 권한이 있지만 struct에서는 공개입니다. 그러나 프로그래밍 고려 사항에 따라 데이터 전용 구조에는 struct 키워드를 사용하십시오. 데이터와 함수가 모두있는 객체에는 class 키워드를 사용하십시오.


또 다른 예이지만 생성자에서 값을 설정할 때이 키워드를 사용 하십시오 .

#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 ++에서는 클래스와 마찬가지로 구조체를 선언 / 정의하고 구조체의 생성자 / 소멸자를 정의하고 변수 / 함수를 정의 할 수 있습니다. 유일한 차이점은 정의 된 변수 / 함수의 기본 범위입니다. 위의 차이점 외에도 대부분 구조체를 사용하여 클래스의 기능을 모방 할 수 있어야합니다.

참고 URL : https://stackoverflow.com/questions/1127396/struct-constructor-in-c

반응형