PL/C++(108)
-
연산자 오버로딩과 관련한 카페 질문
연산자 오버로딩과 관련해서 카페에 질문이 올라와 답변을 달았다 const Point &ref가 들어가면 기존의 operator*는 const 객체에 대해서도 재귀적으로 함수를 실행할 수 있어야 되는데, const 키워드가 없기 때문에 에러가 발생한다. 따라서 Point operator*(int times) 뒤에 const를 붙여야만 한다 #include #include using namespace std; class Point { private: int xpos, ypos; public: Point(int x = 0, int y = 0) : xpos(x), ypos(y) {} void ShowPosition() const { cout
2019.08.23 -
클래스 템플릿을 헤더파일에 작성해야 하는 이유
main.cpp에 다른 소스파일에 작성되어 있는 템플릿의 정보를 알아야 하는 경우가 있다. 템플릿의 특수성 때문에 템플릿을 사용할 때는 헤더파일뿐만 아니라 컴파일 시점에서 소스파일 내용까지 알아야 한다. 따라서, 전처리에서 이미 템플릿 내용이 포함되어야만 한다. 서로 다른 소스파일에서 컴파일 될 때는 파일 단위로 컴파일되기 때문에 해당 시점에서는 main에서 템플릿 소스파일을 참조할 수가 없기 때문이다 해당 문제를 해결하는 문제는 총 2가지 해법이 있다 1. 헤더파일에서 템플릿 선언을 하는 것 2. 소스파일에서 하되, main에서 .cpp 파일을 inlcude하는 것
2019.08.23 -
const 정리
1. const 반환은 해당 반환값이 Rvalue로만 사용된다면 붙여지게 된다. 만일 Lvalue로도 사용된다면 const를 붙이지 않아야 한다 2. 매개변수에는 웬만하면 모두 const를 붙이도록 한다. 왜냐하면 매개변수는 보통 대입되는 값으로 들어가기 때문에 변할 일이 없기 때문이다 3. const 키워드 함수도 최대한 함수마다 만드는 것이 좋다
2019.08.23 -
Lvalue와 Rvalue
C++에서의 모든 표현식은 Lvalue 혹은 Rvalue다. Lvalue는 단일 표현식 이후에도 없어지지 않고 지속되는 객체다. Lvalue는 쉽게 말해 변수라고 생각하면 되고, Rvalue는 상수 혹은 임시 객체다. 예를 들어 전위연산자는 Lvalue, 후위연산자는 Rvalue다. 보통 Rvalue를 참조하려고 하면 에러가 뜬다. C++11 이상부터는 &&참조연산자를 이용해 Rvalue를 참조할 수 있다. 혹은 const T &를 사용한다 [추가] Lvalue가 될 수 없는 const 객체는 반드시 const 반환을 해야만 한다 int& Array::operator[](int index){ return pArr_[index]; } const int& Array::operator[](int index) ..
2019.08.23 -
const 반환의 의미
#include #include using namespace std; class Sample { private: char *str; public: Sample() { str = new char[255]; strcpy(str, "1234"); }; ~Sample() { delete[] str; } char *getString() { return str; } }; int main(void) { char *tmp = new char[255]; Sample *s = new Sample(); tmp = s->getString(); strcpy(tmp, "abcd"); cout getString() getString(); // 컴파일 오류 strcpy(tmp, s->getString()); cout getStrin..
2019.08.22 -
Default 멤버 함수
클래스를 생성하면 기본적으로 6가지의 멤버함수가 생성된다 1. 기본 생성자 2. 소멸자 3. 복사 생성자 4. 치환 연산자 5. 주소값 반환 &연산자 6. const 객체에 대한 주소값 반환 &연산자 class Empty { // default member function Empty(); ~Empty(); Empty(const Empty &rhs); Empty& operator=(const Empty &rhs); Empty* operator&() {return this;} const Empty* operator&() const {return this;} };
2019.08.22