[delete]

 

특정 함수의 사용을 명시적으로 막는다.

 

class Knight
{
private:
	void operator=(const Knight& k);
};

과거 사용하던 방식은 멤버 함수를 private으로 설정하고 정의를 안하는 방식이었는데, 이런 경우 빌드에서는 문제가 없으나 정의가 안되어 있으므로 해당 함수에 접근시 링크 단계에서 에러가 발생하게 된다.

그렇기 때문에 에러가 조기에 발견되지 않는 문제가 발생한다.

 

class Knight
{
public: // public으로 두는게 통상적인 관례
	void operator=(const Knight& k) = delete;
};

 이렇게 delete를 붙여주게되면 해당 함수에 접근하는 경우 빌드시 에러를 잡아줄 수 있다.

 

[override, final]

 

가상함수와 연관성이 있다.

 

class Creature
{
};

class Player : public Creature
{
public:
	virtual void Attack() {}
};

class Knight : public Player
{
public:
	virtual void Attack() {}
};

int main()
{
	Creature* player = new Knight();
	player->Attack(); // 사용 불가!
    
    delete player;
    return 0;
}

가상함수의 문제는 현재 내 클래스에서 최초로 정의한 함수인지, 혹은 부모 클래스에서 정의된 함수인지를 알 수 있는 방법이 없다.

 

class Player : public Creature
{
public:
	virtual void Attack() {}
};

class Knight : public Player
{
public:
	virtual void Attack() override {} // 오버라이딩을 명시
};

오버라이딩한 멤버 함수에 override 키워드를 붙여줌으로써 상속받은 가상 함수라는것을 명시적으로 표현할 수 있다.

실수 방지 및 가독성이 좋아지게 된다.

C#에서는 기본적인 문법이다.

 

 

final은 재정의를 막는 키워드이다.

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

[Modern C++] 전달 참조(forwarding reference)  (0) 2022.08.31
[Modern C++] 오른값 참조 (rvalue reference)  (0) 2022.08.31
[Modern C++] #1  (0) 2022.08.31
[STL] algorithm  (0) 2022.08.31
[STL] set, multimap, multiset  (0) 2022.08.31

+ Recent posts