Game Develop

클래스 생성 시, 따로 작성하지 않아도 자동으로 추가되는 것은? 본문

C++/GeeksForGeeks Quiz

클래스 생성 시, 따로 작성하지 않아도 자동으로 추가되는 것은?

MaxLevel 2022. 7. 6. 21:48

 

클래스 생성 시 따로 코드로 작성하지 않아도 디폴트로 추가되는 생성자,연산자 등을 선택하는 문제이다.

A,B,C 모두 해당되기 때문에 정답은 D인 All of the above 이다.

아래의 예시코드를 보면, 클래스 생성과 변수 선언만 했을 뿐이지만 기본생성자,복사생성자,대입연산자 전부 잘 작동한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Temp
{
public:
    int a = 0;
};
 
int main()
{
    Temp temp1; // A constructor without any parameter // OK.
    temp1.a = 20;
 
    Temp temp2(temp1); // Copy Constructor // OK.
 
    Temp temp3;
    temp3 = temp1; // Assignment Operator // OK.
 
    cout << "Temp1.a : " << temp1.a << endl;
    cout << "Temp2.a : " << temp2.a << endl;
    cout << "Temp3.a : " << temp3.a << endl;
}
cs

 

기본생성자같은 경우, 따로 작성하지 않더라도 컴파일러가 기본생성자를 만들어 준다.

주의할 점은 클래스에 다른 생성자(매개변수를 받는 생성자 등)가 하나라도 작성되어 있을 경우, 컴파일러는 기본생성자를 만들어 주지 않는다.

 

컴파일러가 자동으로 생성하는 복사생성자는 모든 멤버변수를 '복사' 한다.

그러면 멤버변수가 포인터변수일 경우, 주소값만 그대로 복사하기 때문에 복사한 객체, 복사당한 인스턴스클래스객체 둘 다 같은 주소값을 가지고 있는 멤버변수를 보유하게 된다.

그러면 같은 힙메모리에 있는 데이터를 가리키게 되기 때문에 의도하지 않은 결과를 도출하게 된다. (얕은복사)

 

그래서 힙메모리의 데이터를 복사생성하려는 의도일 경우, 복사생성자를 따로 작성해준다.

좀 더 자세한 글은 아래링크에 정리했다.

https://maxlevel-trace.tistory.com/15?category=805943 

 

[C++] 복사생성자 , 얇은복사 깊은복사

복사생성자란 C++에서 복사 생성자란 자신과 같은 클래스 타입의 다른 객체에 대한 참조(reference)를 인수로 전달받아, 그 참조를 가지고 자신을 초기화하는 방법이다. 복사생성자를 설명하면서

maxlevel-trace.tistory.com

 

대입연산자.

https://maxlevel-trace.tistory.com/16?category=805943 

 

[C++] 대입연산자

대입연산자는 이미 생성된 인스턴스에 다른 인스턴스를 대입할 때 수행된다. 디폴트로 얇은복사가 수행된다. 복사생성자와 헷갈리지 말아야 할 점으로, 복사생성자는 선언과 동시에 초기화할

maxlevel-trace.tistory.com

 

'C++ > GeeksForGeeks Quiz' 카테고리의 다른 글

간단한 문제들 3  (0) 2022.07.14
간단한 여러 문제들 2  (0) 2022.07.09
간단한 여러 문제들 1  (0) 2022.07.07
복사생성자는 언제 호출되는가?  (0) 2022.07.07
GeeksForGeeks 문제 정리.  (0) 2022.07.06