Chapter 1 C++에 왔으면 C++의 법을 따릅시다


* const, enum, inline으로 #define을 얼마든지 대신할 수 있다. 또한 대신해서 쓰는게 더 안정성이 좋다.


 정적멤버로 만들어지는 정수류 타입의 클래스 내부 상수는 정의가 아닌 선언이다. 해당 멤버의 주소를 구하거나 할 때에는 정의를 따로 해주어야 한다.


* const가 붙는 위치에 따라 의미가 조금 달라진다.

const int *ip : 타입이 상수, 포인터는 비상수이므로 포인터가 가리키는 대상의 값이 상수화된다. 가리키는 대상이 변경되어도 문제 없음.

int const *ip : 타입이 비상수, 포인터는 상수이므로 포인터가 가리키는 대상 자체가 상수화된다. 가리키는 대상이 변경되면 에러가 발생된다. 가리키는 대상의 값을 변경하는것은 문제 없음.


* 멤버함수에 붙는 const의 역할은 해당 멤버함수가 상수객체에 대해 호출될 함수라는 사실을 알려주는 역할이다.

const 키워드가 있고 없고의 차이만 있는 멤버함수들은 오버로딩이 가능하다.


* 멤버함수가 상수함수라는 의미의 개념은 비트수준 상수성(물리적 상수성)과 논리적 상수성이다.

비트수준 상수성 : 멤버함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야 상수임을 인정. (정적멤버 제외)

논리적 상수성 : 객체의 일부 몇비트 정도는 바꿀수있되, 사용자측에서 알아채지 못하게만 하면 상수멤버 자격 인정.


 상수/비상수 멤버함수의 코드중복을 피하기 위해 두번의 캐스팅을 사용하여 코드중복을 없앤다. (비상수 멤버함수 안에서 static_cast로 상수성을 부여하여 상수멤버함수의 함수를 실행한 후 const_cast로 상수성을 뗀 값을 반환하면 됨)


 초기화와 대입은 엄연히 다르다. TextBlock(std::string str) : text(str) {} 이런게 초기화임. 이런 방식은 복사 생성자에 의해 초기화 되는것이 원리임. 기본 생성자로 초기화하고 싶으면 생성자 인수로 아무것도 주지 않으면 됨.


 초기화 리스트에 의해 초기화 될 시, 초기화 되는 순서는 선언한 순서대로 초기화된다. 혼동을 방지하기 위해 선언과 초기화리스트 순서를 동일하게 맞춰주는 것이 좋다.


 비지역 정적 객체의 초기화 순서는 개별 번역 단위에서 정해진다.

정적 객체 : 전역 객체, 네임스페이스 유효범위에서 정의된 객체, 클래스 안에서 static으로 선언된 객체, 함수안에서 static으로 선언된 객체, 파일 유효범위에서 static으로 정의된 객체.

함수안에 있는 정적 객체를 지역 정적 객체라고 한다. 그 외의 모든것은 비지역 정적 객체.


* 비지역 정적 객체를 하나씩 맡는 함수를 만들어서 참조자를 반환하게 만들어서 사용하면 초기화 되는 순서를 프로그래머가 잡아줄 수 있다.

+ Recent posts