728x90
반응형
목차
Delete 함수
Delete함수는 C++11에서 처음 나왔다. 어떤 함수를 삭제(delete)시키면 그 함수에 대한 어떤 호출도 불가능하게 된다.
함수를 사용하지 않거나 호출하지 않을 것이면 아예 만들지 않으면 된다고 생각할수 있지만, 함수 삭제는 컴파일러가 자동적으로 생성해주는 함수들의 접근을 방지해주는 것에 도움을 준다. ex)생성자, 소멸자, 대입연산자,nullptr
private의 한계와 정의되지 않은 함수
c++11 이전에서는 private를 이용하여 함수의 접근을 막아왔다.하지만 private는 삭제가 아닌 클래스 내부에 존재하며 클래스 내부에서 사용이 가능하기 때문에 접근할수있는 예외는 언제나 존재하기 마련이다.
class User
{
private:
void operator=(const User& u)
{
}
friend class Admin;
};
class Admin
{
public:
void Copy(const User& u)
{
User u1;
u1=u;
}
};
구현이 된 함수는 이러한 식으로 private는 friend를 지정해준다던가의 방식으로 우회가 가능하기 때문에 완벽하게 안전하다고 볼수 없다.
그렇기에 이러한 원치않는 활용을 방지하고자 정의되지 않은(비구현)함수를 사용하면 접근을 막을수 있다.
class User
{
private:
void operator=(const User& u);
friend class Admin;
};
class Admin
{
public:
void Copy(const User& u)
{
User u1;
u1=u; // Error
}
};
delete함수 구현
C++11이전까지는 이런식으로 비구현함수로 접근을 막아왔지만 이런 방식은 가독성이 떨어질수 있다.
예를 들면 디버깅을 하거나 할때 자신이 실수로 구현을 하지 않았다고 생각이 되어 {}를 붙이거나 하는 형태를 취하게되면 다시 은닉성에 문제가 발생하게 되는 것이다.
그러므로 사용이나 접근을 원치 않는 함수는 delete를 이용하여 삭제하는 것을 원칙으로 하고 있다.
class User
{
public:
void operator=(const User& u)=delete;
friend class Admin;
};
class Admin
{
public:
void Copy(const User& u)
{
User u1;
u1=u; // Error 삭제된 함수를 참조하려고 합니다
}
};
728x90
반응형
'C++복습' 카테고리의 다른 글
| C++복습) Modern C++/ 오른값 참조( rvalue)와 std::move (0) | 2021.12.29 |
|---|---|
| C++복습) Modern C++/ override , final (0) | 2021.12.28 |
| C++복습) Modern C++/ enum class (0) | 2021.12.24 |
| C++복습) Modern C++/ Using (0) | 2021.12.22 |
| C++복습) Modern C++/ Nullptr (0) | 2021.12.22 |
댓글