반응형
해당 게시글은 Effecitve C++ 참고하며 개인 공부목적으로 적은 글입니다.
Effecitve C++ 80P
디폴트 생성자(default constructor)
디폴트 생성자란 객체가 생성될 때 사용자가 초기값을 직접 작성하지 않으면 컴파일러가 자동으로 만드는 생성자이다.
소멸자, 대입연산자도 마찬가지로 직접 초기값을 설정하지 않는다면 컴파일러가 자동으로 만들어준다.
원형
Class::Class() {}
디폴트 생성자 선언
class TestClass
{
};
int main()
{
TestClass Test; // 암시적 호출
TestClass Test = TestClass(); // 명시적 호출
return 0;
}
디폴트 생성자, 소멸자, 복사생성자 및 대입연산자
비어있는 클래스를 만든다고 하더라도 말 그대로 비어있는게 아니라
컴파일러가 자동적으로 디폴트함수들을 생성해주게 된다.
class TestClass
{
TestClass() {} // 디폴트 생성자
TestClass(const TestClass& Ref) {} // 디폴트 복사 생성자
~TestClass() {} // 디폴트 소멸자
TestClass& operator = (const TestClass& Ref) {} // 디폴트 복사 대입 연산자
};
이들이 만들어지는 조건
TestClass T1; // 디폴트 생성자
TestClass T2(T2); // 디폴트 복사 생성자
T2 = T1; // 디폴트 복사 대입 연산자
문제가 되는 복사 대입 연산자 사용
#include "Widget.h"
#include <string>
template<class T>
class NameObject
{
public:
NameObject(std::string& Name, const T& Value)
{
}
private:
std::string& NameValue;
const T ObjectValue;
};
int main()
{
std::string NewDog("Persephone");
std::string OldDog("Satch");
NameObject<int> P(NewDog, 2);
NameObject<int> S(OldDog, 36);
// 레퍼런스의 특성상 P.NameValue의 기존 string참조자 이외의 다른 객체를 참조 할 수 없다.
// 상수 특성상 대입연산이 안되어 변경 불가함.
//P = S;
return 0;
}
주석에 달아놓은 내용처럼 레퍼런스의 특성상 P.NameValue의 기존 string참조자 이외의 다른 객체를 참조 할 수 없고
상수 특성상 대입연산이 안되어 변경 불가한것을 주의해야 한다.
디폴트 함수가 필요없다면 금지하기
class Test
{
public:
Test() {}
~Test() {}
private:
Test(const Test&) {}
Test& operator = (const Test&) {}
};
디폴트 함수가 필요없다면 private을 이용해서 접근하지 못하도록 막아준다.
반응형
'Effective C++ (개인 공부)' 카테고리의 다른 글
객체 초기화 (0) | 2022.11.04 |
---|
댓글