• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Effective c++
 

Effective c++

on

  • 109 views

Effective C++ 요약 -1-

Effective C++ 요약 -1-

Statistics

Views

Total Views
109
Views on SlideShare
109
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Effective c++ Effective c++ Presentation Transcript

    • Efective C++ -1- 채원
    • C OOP STLTemplate C++ C++은요..
    • DEFINE #define 현찬 0xBAB0 Blahblah(); { . int a = 현찬; . } Shalashla(); { . } 전처리기 Blahblah(); { . int a = 0xBAB0; . } Shalashla(); { . } 컴파일러
    • 컴파일러 난 현찬이 몰라 ! 매크로 대신, const, enum, inline 이용하자! 문제점
    • DEFINE 대신 CONST를 사용하려할 때 주의점 1. 상수 포인터를 정의하려고 할 때 포인터가 정의하는 대상도 const로 선언하는 것이 일반적! const char* const leegunhee = “SAMSUNG”; 2. 클래스 멤버로 상수를 정의하려할 때 사본이 여러 개 생기지 않도록 static으로 선언한다! 3. 누군가 const 상수의 주소를 가져다 쓰는 것이 싫을 때 enum을 사용하자! enum의 주소는 가져다 쓸 수 없어요 enum은 메모리가 아닌 코드 상에만 존재합니다 4. define 매크로로 함수를 호출하고자 할 때 inline 함수에 대한 Template을 만들면 돼요! 함수가 쓰이는 곳마다 정의가 복사돼요. (컴파일러 마음) 그래서 빠르면서도, 여러 번 변수가 평가되지 않아서 안정적이에요.
    • const char *p char* const p 상수 포인터? 상수 데이터? 뭘까요?
    • 반환값이 const이다, 아니다에 따른 함수 오버로딩 코드 중복이 꼴보기 싫어요! 그러면 비상수 버전 함수가 상수버전 함수를 호출하게 해! 캐스팅으로~
    • 비상수 버전 함수의 상수 버전 함수 호출 const char& operator[] (std::size_t position) const { return text[position]; } char& operator[] (std::size_t position) { return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]; }
    • 객체는 꼭 초기화 해주세요 쓰레기가 될지도 몰라요.
    • 생성자에서 대입하지 않고 초기화하기! NEXT::NEXT(int a, int b) : theA(a), theB(b) {} 초기화 리스트의 순서와, 선언된 순서를 맞춰주세요
    • 나 몰래 컴파일러가 무슨 짓을? 기본 생성자 복사 생성자 소멸자 복사 대입 연산자 뚝딱뚝딱
    • 컴파일러가 만든 것들은 전부다 public 이에요 객체를 아무나 맘대로 복사하려고 해요 ㅠ ㅠ -> private 으로 선언만! 정의하지 마요 누가 쓰려고 했다면, 링크 시점에 에러가 날거에요. 컴파일 시점에 에러가 나도록 바꾸고 싶다면 -> 복사를 금지하고 싶은 클래스의 복사 생성자와 복사 대입 연산자를 private으로 가진 클래스를 따로 만들어요.
    • 기본 클래스에게는 가상 소멸자를 주세요! 그렇다고 모든 소멸자를 virtual 로 선언한다면.. ->과유불급 클래스 내부에 가상함수가 하나라도 있을 때만 그렇게 하세요! 가상 함수 테이블에 깔려 죽어요 가상 소멸자가 없는 STL 컨테이너 타입을 상속받아서 뭔가 만들고 싶다고요? ->당신은 몰지각한 프로그래머 - 저자 -
    • 예외라니요?! 소멸자에서 예외가 발생하지 않도록 조심해야 해요. 예외가 발생하면 소멸자가 꿀꺽꿀꺽 하거나, 프로그램이 종료되어야 해요. 함수에서 예외가 발생해야 프로그래머가 잘 대처할 수 있어요.
    • 당연한 당부 생성자, 소멸자 안에서 virtual 함수는 호출하지 말아요. ->부모가 덜 만들어져서 자식은 아직 쓰레기 값이에요. 당연하게도 ㅠㅠ
    • 대입 연산자는, *this의 참조자를 반환하도록 해주세요 관례래요. class Test { public: . . . Test& operator= (const Test& rhs) { . . . return *this; } . . . };
    • 대입 연산자가 좀 더 안정적일 수 있도록 자기 대입 예외처리를 해주면 좋을 것 같아요! Test& Test::operator=(const Test& rhs) { Bitmap *bitmap = pb; pb = new Bitmap(*rhs.pb); delete bitmap; return *this; } 원래의 pb를 어딘가에 기억해 두고, pb가 *pb의 사본을 가리키게 만들고 원래의 pb를 삭제합니다.
    • 객체는 내용물을 빼먹지 말고 전부다 복사해주세요 만약 필요해서 클래스를 복사하는 함수를 직접 만든다면, 1. 데이터 멤버를 모두 복사하고 2. 부모 클래스의 복사 함수도 꼬박꼬박 호출해 줍시다.