C++

05: C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 C++에서 복사 생성자, 복사 대입 연산자, 소멸자 그리고 생성자가 선언되어 있지 않다면 기본 생성자를 컴파일러가 대신에 만들어 놓는다. 이들은 모두 public, inline 멤버이다. class Empty{}; class Empty { public: Empty() { ... } Empty(const Empty& rhs) { ... } ~Empty() { ... } Empty& operator=(const Empty& rhs) { ... } }; 위와 아래가 동일하다는 뜻이다. 기본 생성자와 소멸자 기본 생성자와 소멸자가 하는 일은 일차적으로 컴파일러에게 "배후의 코드"를 깔 수 있는 자리를 마련하는 것이다. 작성한 클래스멤버인 기본..
04: 객체를 사용하기 전에 반드시 그 객체를 초기화하자 초기화 되지 않은 값을 읽는다면 의도되지 않은 동작이 그대로 흘러나오게 된다. 이런 방법을 막기 위해서 가장 좋은 방법은 모든 객체를 사용하기 전에 항상 초기화하는 것이다. int x = 0; // 직접 초기화 const char* text = "Hello"; // 직접 초기화 double d; std::cin >> d; // 입력 스트림에서 읽음으로써 초기화 수행 위의 부분을 제외하고는 C++의 초기화는 생성자에서 이루어진다. 대입과 초기화를 헷갈리지 말자 class PhoneNumver {}; class ABEntry { public: ABEntry(const string& name, const string address, const list&..
03: 낌새만 보이면 const를 들이대 보자! const는 의미적인 제약을 코드 수준에서 붙인다는 점과 컴파일러가 이 제약을 단단히 지켜준다는 점이 아주 좋은 부분이다. const는 항목 02에서 처럼 전역 혹은 네임스페이스, 유효범위의 상수를 선언하는데도 쓸 수 있다. const의 가장 강력한 용도는 함수 선언에 쓸 경우이다. 함수 반환값을 상수로 정해주면, 안정성이나 효율을 포기하지 않고도 사용자측의 에러 돌발 상황을 줄이는 효과를 꽤 자주 볼 수 있다. class Rational {}; const Rational operator*(const Rational& lhs, const Rational& rhs); Rational a, b, c; if(a * b = c) {}// a * b == c의 오타..
02: #define을 쓰려거든 const, enum, inline을 떠올리자 핵심은 가급적 선행 처리자보다 컴파일러를 더 가까이 하자이다. #define은 전처리기에서 처리되므로 컴파일러가 사용할 기호 테이블에 들어가지 않는다. 이 때, 문제가 야기될 수 있는데 다음을 보자. #define ASPECT_RATIO 1.653 컴파일러에게 넘어가기 전에 전처리기에선 ASPECT_RATIO를 숫자 상수로 모두 바꾸어 버린다. 이렇게 숫자 상수로 대체된 코드에서 컴파일 에러가 발생하면 에러 메시지에는 ASPECT_RATIO대신 1.653이 있을 것이다. 이런 문제의 해결법은 매크로 대신 상수를 쓰는 것이다. const double AspectRatio = 1.653; 이렇게 하면 당연히 컴파일러의 기호 테이블..
01: C++를 언어들의 연합체로 바라보는 안목은 필수 C++은 다준패러다임 프로그래밍 언어이다. C++을 단일 언어로 바로보는 눈을 넓혀, 상관관계가 있는 여러 언어들의 연합체로 보는 것이 중요하다. C C++은 여전히 C를 기본으로 하고 있다. 블록, 문장, 선행 처리자, 기본제공 데이터 타입, 배열, 포인터 등 대부분이 C에서 넘어왔다. 객체 지향 개념의 C++ 클래스를 쓰는 C에 관한 것 모두이다. 클래스(생성자와 소멸자), 캡슐화, 상속, 다형성, 가상 함수(동적 바인딩) 등 템플릿 C++ 템플릿 메타프로그래밍이라는 새로운 패러다임이 생길 정도로 템플릿은 강력하다. STL 컨테이너, 반복자, 알고리즘과 함수 객체와 같은 템플릿 라이브러리 이렇게 C++은 네 가지의 하위 언어들로 이루어져 있고, ..
참조자를 사용해 복사 피하기 함수의 인자 전달에서 크기가 큰 클래스타입이나 컨테이너 객체를 복사하는 것은 비효율적일 수 있다. 게다가 일부 클래스 타입은 복사할 수 없다. 복사할 수 없는 타입인 객체와 연산하려면 함수에서는 참조자 매개변수를 사용해야 한다. bool isShorter(const string &s1, const string &s2) { return s1.size() < s2.size(); } 두 string의 길이를 비교하는 함수를 만들 때, string의 길이는 길 수 있기에 복사를 피하고 싶다면 매개변수를 참조자로 만든다. 가능하면 const에 대한 참조자를 사용한다. 함수에서 변경하지 않는 매개변수를 const가 아닌 보통의 참조자로 정의하면 좋지 못하다. 함수를 호출하는 쪽에서는 그..
const_cast는 피연산자의 하위 const만을 변경하여 const를 날려 버릴 수 있다. int main() { char str[] = "abcd"; const char* csptr = str; char* sptr = const_cast(csptr); sptr[1] = 'B'; cout
const에 대한 참조자 const에 대한 참조자는 const인 객체나 contst가 아닌 객체, 상수와 결합할 수 있다. 그러나 일반적인 참조자는 const가 아닌 객체와 결합할 수 있으나 const인 객체와는 결합할 수 없다. int i = 42; const int &r1 = i; // const int&를 보통의 int 객체에 결합할 수 있다. const int &r2 = 42; // 좋음: r2는 const에 대한 참조자이다. const int &r3 = r1 * 2; // 좋음: r3는 const에 대한 참조자이다. int &r4 = r1; // 오류: r4는 const가 아닌 보통의 참조자이다. const에 대한 포인터 const에 대한 포인터 역시 참조자와 마찬가지로 const에 대한 포인터..
https://modoocode.com/136 씹어먹는 C++ - modoocode.com 이름 공간 - namespace 이름 공간은 말그대로 어떤 정의된 객체에 대해 어디 소속인지 지정해주는 것과 동일하다. 중복된 이름을 구분하기 위해 C++에서는 같은 이름이라도, 소속된 이름 공간이 다르다면 다른 것으로 취급한다. (동명이인) std::cout 위의 코드에서 std가 이름 공간이 된다. std::가 없이 그냥 cout이라고 한다면 컴파일러는 cout을 찾지 못한다. 이름 공간을 정의하는 방법은 다음과 같다. // header1.h namespace header1 { int aaa(); void bbb(); } // header2.h namespace header2 { int aaa(); void b..
· C++/기타
https://www.youtube.com/watch?v=QXjU9qTsYCc 뒤져보다가 발견한 영상. 컴퓨터는 코드를 어떻게 읽는지에 대해 나도 이해하기 쉽게 설명해준다. 컴파일러의 역할인 코드를 기계어로의 변환에 대한 설명
KANTAM
'C++' 카테고리의 글 목록 (6 Page)