목록Effective (40)
센로그

복사 생성이나 복사 대입연산이 아예 수행되면 안되는 경우도 있다이럴 때는 실수로 사용하게 되어 컴파일러가 몰래 만들어내는 일이 없도록, 아예 사용을 금해버려야 한다.사용 안할 복사 생성자나 복사 대입연산자를 private 멤버로 선언하여, 외부에서 호출하지 못하도록 한다.이때, 선언만 하고 정의는 하지 않는다.정의를 해버리면 멤버 함수나 friend 함수에서 사용해버릴 수도 있기 때문이다.또는 delete 키워드를 사용하면 된다.불필요하거나 잘못된 사용을 방지하기 위해 특정 멤버 함수의 사용을 금지할 때 delete 키워드를 사용한다. +) 책에서 ios_base 클래스도 private 복사 생성자 구현되어 있다고 해서 찾아봤다.보다 최신 문법인 delete를 사용하고 있었다. (C++11 도입)
내가 직접 만들지 않으면 컴파일러가 자동으로 만들어주는 것들컴파일러는 경우에 따라 클래스에 대해 다음 함수들을 암시적으로 정의한다.생성자복사 생성자복사 대입 연산자소멸자 즉, 우리가 다음과 같이 선언했다면class Empty {}; 이렇게 쓴 것과 똑같다는 것이다.class Empty{ public: Empty(){...} // 기본 생성자 Empty(const Empty &rhs){...} // 복사 생성자 ~Empty(){...} // 소멸자 Empty& operator=(const Empty &rhs){...} // 복사 대입 연산..
객체의 초기화가 중요한 이유는?예기치 못한 상황을 방지하기 위해서.C++의 객체 초기화 규칙은 랜덤인가?아니다. 언제 초기화가 보장되고 아닌지 명확히 정해져있다.그러나 전부 기억하기에는 규칙이 너무.. 복잡하다.따라서 가장 좋은 방법은, 모든 객체를 사용 전에 항상 초기화하는 것이다. 생성자 - 대입을 통한 초기화 vs 초기화 리스트대입을 통한 초기화기본 생성 후에 대입이 이루어진다. 따라서 멤버 변수가 두 번 초기화된다.기본 생성 후, 복사 대입 연산자를 통해 복사.클래스 타입의 멤버변수의 경우, 해당 클래스의 기본 생성자가 호출되어 초기화된다. 이후에 생성자 내부에 있는 대입 연산을 통해 덮어씌워 지는 것이다.단, 내장 타입은 별도의 초기화가 없다.const 멤버나 & 멤버는 대입이 불가능하므로, 대..

const 키워드의 장점가독성: 값을 변경하지 않겠다는 제작자의 의도를 컴파일러 및 다른 프로그래머들과 나눌 수 있다.안정성 및 오류 방지: 변수 값의 실수로 인한 변경 방지함수에서 사용하는 것도 좋음상수 멤버함수: const와 non const 함수 오버로딩 지원즉 같은 이름으로 r/w 둘다 되게, 또는 r만 되게 만들 수 있음.반환값 및 매개변수도 상수화 가능 상수 포인터 vs 상수 객체를 가리키는 포인터쉽게 구분하는 법!*와 포인터변수명 사이에 const가 붙은 경우만 상수 포인터를 의미함. 나머지는 다 상수 객체. STL const iterator vs const_iteratorstd::vector vec = {1, 2, 3};std::vector::iterator const it1 = vec.b..

가급적 전처리기보다 컴파일러를 더 가까이 하자.#define을 쓰면, 전처리기가 텍스트를 상수로 대체해서 컴파일러에게 넘긴다.컴파일러의 기호 테이블에도 이름이 들어가지 않는다. 매크로 상수보다는 const나 enum을 쓰자.매크로 상수전처리기가 해주는 단순한 텍스트 치환이다.스코프 개념 없이 전역적이다.타입 안정성도 없다.메모리에 안 올라가며, 따라서 주소 참조도 안된다.const 객체컴파일러가 처리해준다. 기호 테이블(symbol table)에 넣어주므로 타입 검사가 가능하다.따라서 특정 스코프 내에서만 사용 가능하도록 할 수도 있다.메모리에 존재하며, 따라서 주소를 참조할 수도 있다.enum 둔갑술 (enum hack)컴파일러가 처리해준다.int 상수가 필요할 때, enum 둔갑술을 사용하면 어느정도..
초창기의 C++초창기 C++은 클래스가 있는 C 였음.그러나 꾸준한 성장을 거치면서 엄청나게 유연해지고 표현성이 좋아짐 C++을 잘 이해하려면 어떻게 해야 할까?C++을 단일 언어로 바라보는 것을 넘어, 상관 관계가 있는 여러 언어들의 연합체로 바라보자.C++을 구성하는 4가지 하위 언어들CC style의 C++ 요소들객체지향 개념의 C++클래스, 캡슐화, 상속, 다형성, 가상함수 ...템플릿 C++템플릿, 템플릿 메타프로그래밍, ...STL컨테이너, 이터레이터, 알고리즘, 함수 객체 ...각 하위 언어들을 뭉쳐서 통합 언어로 만든 것이 아니라, 각 하위 언어가 자신만의 규칙을 갖고 있는 형태이다.따라서 이 중에서 어떤 부분을 사용하느냐에 따라, C++을 사용한 효과적인 프로그래밍 규칙이 달라진다.