언어

언어/C++

[Effective C++] 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자

항목 6 : 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 코딩을 하다보면 객체의 복사를 막고 싶은 경우가 있습니다. 하지만 복사 생성자나 복사 대입 연산자를 선언하지 않으면 컴파일러가 저절로 만들어 낼지도 모릅니다. 그렇다고 직접 선언하면 복사하는 것은 마찬가지입니다. 이를 해결하기 위한 방법은 복사 생성자 및 복사 대입 연산자를 private 멤버로 선언하는 것입니다. 여기에도 부족한 것이 있습니다. private 멤버 함수는 그 클래스의 멤버함수 및 프렌드 함수가 호출할 수 있다는 점이죠. 이것까지 막으려면, '정의'를 안 해 버리는 방법이 있습니다. 정의되지 않은 함수를 누군가가 어쩌다 실수로 호출하려 했다면 분명히 링크 시점에 에러를 보지게 될 테니 괜찮습니다. 1 2..

언어/C++

[Effective C++] C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자

항목 5 : C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 클래스가 비어 있지만 비어 있는 게 아닌 때가 있습니다. C++(컴파일러)가 빈 클래스를 훑고 지나갈 때 입니다. C++의 어떤 멤버 함수는 여러분이 클래스 안에 직접 선언해 넣지 않으면 컴파일러가 저절로 선언해 주도록 되어 있습니다. 바로 복사 생성자, 복사 대입 연산자, 그리고 소멸자 입니다. 이때 컴파일러가 만드는 함수의 형태는 모두 기본형입니다. 이들은 모두 public 멤버이며 inline함수입니다. 여러분이 다음과 같이 썼다면 1 class Empty(); 다음과 같이 쓴 것과 근본적으로는 같다는 이야기입니다. 1 2 3 4 5 6 7 8 9 class Empty{ public: Empty(){...} // 기본 생성자..

언어/C++

[Effective C++] 객체를 사용하기 전에 반드시 그 객체를 초기화하자

항목 4 : 객체를 사용하기 전에 반드시 그 객체를 초기화하자 단순 선언 시, 객체의 값을 초기화하는 데 있어서 C++은 항상 초기화를 보장하지는 않습니다. 1 2 3 4 5 6 class Point { int x, y; }; ... Point p; 위와 같이 하였을 때, p의 데이터 멤버 역시 어떤 상황에서는 초기화가 보장되지만 어쩔 때는 안됩니다. C++의 C부분만을 쓰고 있으며 초기화에 런타임 비용이 소모될 수 있는 상황이라면 값이 초기화된다는 보장이 없습니다. 하지만 STL부분에서는 초기화가 됩니다. 가장 좋은 방법은 모든 객체를 사용하기 전에 항상 초기화하는 것입니다. 기본제공 타입으로 만들어진 비멤버 객체에 대해서는 초기화를 손수 해야 하겠습니다. 1 2 3 4 5 6 int x = 0; //..

언어/C++

[Effective C++] 낌새만 보이면 const를 들이대 보자!

항목 3 : 낌새만 보이면 const를 들이대 보자! const의 장점은 '의미적인 제약'을 소스 코드 수준에서 붙인다는 점과 컴파일러가 이 제약을 단단히 지켜준다는 점일 것입니다. const 키워드는 클래스 바깥에서는 전역 혹은 네임스페이스 유효범위의 상수를 선언(정의)하는 데 쓸 수 있습니다. 그뿐 아니라 파일, 함수, 블록 유효범위에서 static으로 선언한 객체에도 const를 붙일 수 있습니다. 클래스 내부의 경우에는, 정적 멤버 및 비정적 데이터 멤버 모두를 상수로 선언할 수 있습니다. 포인터에서 const는 아래와 같이 사용할 수 있습니다. 1 2 const int * a = data // 비상수 포인터, 상수 데이터 int * const a = data // 상수 포인터, 비상수 데이터 1..

언어/C++

[Effective C++] #define을 쓰려거든 const, enum, inline을 떠올리자

항목 2 : #define을 쓰려거든 const, enum, inline을 떠올리자 #define ASPECT_RATIO 1.653 이라는 코드를 작성했을때 작성자에게는 ASPECT_RATIO가 기호식 이름으로 보이지만 컴파일러에게는 보이지가 않습니다. 선행 처리자가 숫자 상수로 바꾸어 버리기 때문입니다. 그 결과로, ASPECT_RATIO라는 이름은 컴파일러가 쓰는 기호 테이블에 들어가지 않습니다. 만약 숫자 상수로 대체된 코드에서 컴파일 에러라도 발생하면 헷갈릴 수 있는 여지가 존재합니다. 이 문제의 해결법은 매크로 대신 상수를 쓰는 것입니다. const double AspectRatio = 1.653; AspectRatio는 언어 차원에서 지원하는 상수 타입의 데이터이기 때문에 컴파일러의 눈에도 보..

언어/C++

[Effective C++] C++를 언어들의 연합체로 바라보는 안목은 필수

항목 1 : C++를 언어들의 연합체로 바라보는 안목은 필수 오늘날의 C++는 다중패러다임 프로그래밍 언어라고 불린다. 절차적 프로그래밍을 기본으로 하여 객체 지향, 함수식, 일반화 프로그래밍을 포함하며 메타프로그래밍 개념까지 지원하고 있다. C++을 단일 언어로 바라보는 시야를 넓혀 상관관계가 있는 여러 언어들의 연합체로 보자! 1. C 2. 객체 지향 개념의 C++ 3. 템플릿 C++ 4. STL 즉 C++은 한 가지 프로그래밍 규칙 아래 똘똘 뭉친 통합 언어가 아니라 네 가지 하위 언어들의 연합체이다! 꼭 잊지 말아야 할 것! C++를 사용한 효과적인 프로그래밍 규칙은 경우에 따라 달라진다. 그 경우는 C++의 어떤 부분을 사용하느냐이다.

지나가던 개발자
'언어' 카테고리의 글 목록 (9 Page)