728x90
반응형
객체의 대입
만약 한 클래스의 객체를 2개를 생성할 때 하나의 객체에 다른 하나의 객체를 대입하면 어떻게 될까?
예를 들어 testclass의 객체 test1을 선언하고 testclass test2 = test1; 과 같은 형태로 객체를 생성하는 것이다.
직관적으로 코드의 의도를 보았을 때 test1의 모든 멤버 변수를 복사하여 test2의 멤버 변수에 대입하려는 코드인 것 같다.
그런데 이게 실제로 될까 라는 의문이 생기는데 놀랍게도 이것은 가능하다.
디폴트 복사 생성자
따로 대입을 위한 생성자를 선언하지 않았더라도 이것이 가능한 이유는 클래스에 디폴트 복사 생성자가 존재하기 때문이다.
예시로 클래스 하나를 작성해 보겠다.
class testclass {
private:
int num1;
int num2;
public:
testclass(int n1, int n2)
:num1(n1), num2(n2)
{ }
};
사실 위 클래스에는 아래 코드와 같은 디폴트 복사 생성자가 자동으로 삽입되어 있는 것이다.
testclass (const testclass ©)
:num1(copy.num1), num2(copy.num2)
{ }
이때 tesetclass ©가 아니라 testclass copy를 사용한다면 원본을 불러오는 것이 아니라 원본을 copy에 복사하여 불러오기 때문에 이때 복사 생성자가 호출되어서 무한 루프에 빠질 수 있다.
대입의 또 다른 방법
그러나 아직까지 해결되지 않은 의문이 남아있을 수 있다.
생성자로 값을 전달하는 것과 객체에 직접 대입하는 것은 다르지 않은가?
즉, 아래 두 줄의 코드가 서로 다르지 않냐는 의미이다.
testclass test2 = test1;
testclass test2(test1);
그러나 두 코드는 결과적으로 같은 의미이다.
따라서 C++에서는 아래와 같은 대입방법도 허용되고 있다.
int num1 = 50;
int num2(100);
int num3(num2);
728x90
반응형
'C++ > C++ 문법' 카테고리의 다른 글
[C++] 얕은 복사, 깊은 복사 (0) | 2024.05.02 |
---|---|
[C++] explicit (0) | 2024.04.30 |
[C++] this 포인터, 메서드 체이닝(Method Chaining), *this의 의미 (0) | 2024.04.29 |
[C++] 객체 배열 (0) | 2024.04.29 |
[C++] 멤버 이니셜라이저 (Member Initializer), const 멤버변수 초기화 (0) | 2024.03.31 |