목록프로그램 (94)
Brise
C에서 구조체를 복사하듯이 C++도 클래스의 복사가 가능하다. 하지만, C에서 포인터의 내용을 직접 복사 불가능하듯이 C++에서도 동적 메모리 할당된 영역은 자동으로 복사되지 않는다(shallow copy) // 1_객체복사.cpp 102 page ~ #include class People { char* name; int age; public: People(const char* n, int a) : age(a) { name = new char[strlen(n) + 1]; strcpy(name, n); } ~People() { delete[] name; } }; int main() { People p1("kim", 20); People p2 = p1; // runtime error } C++ 컴파일러가 자..
객체지향 : 필요한 타입을 만들자 타입(클래스)를 만들때 사용하는 문법들 (A). 접근지정자(private, public, protected) (B). 생성자 => 초기화 리스트로 초기화 하자 => explicit 생성자 (C). 소멸자 => 오직 한개만 만들수 있다. 인자를 가질수 없다. (D). 복사 생성자 (E). static 멤버 (F). 상수 멤버 함수 (G). this 개념. 상속과 객체지향 디자인 // 구글 C++ IDioms // C++ IDioms : C++에서 자주 사용되는 코딩기법에 // 이름을 붙인것! // 헤더의 내용을 사용자 에게 감출수 없을까 ? "PIMPL 기법" // Architecture : OS를 만들거나, 미들웨어(DB)의 설계기술 // Design Pattern : ..
C++ 컴파일러는 복사 생성자를 지정하지 않은 경우 디폴트 복사 생성자를 만들게 된다. 하지만 컴파일러는 포인터 변수에 대하여 얕은 복사를 수행하게 되어 원본 클래스의 포인터 변수는 실제로 복사되지 않고 포인터 값만 복제되어 복사생성자로 생성된 클래스의 멤버가 된다. 만약 원본 클래스의 life line이 종료되는 경우 복사생성자로 생성된 클래스의 포인터는 invalid한 값을 가리키게 된다. 이 때문에 클래스에 포인터 변수가 있는 경우 유저는 복사생성자를 직접 생성하여 deep copy를 직접 수행하여야 한다. // 12_객체복사 - 102 page.. C++기본의 핵심 주제!! #include // 클래스 안에 포인터 멤버가 있으면 // 컴파일러가 만드는 복사 생성자는 "얕은복사(shallow cop..
// 11_복사생성자 92 page #include class Point { int x, y; public: Point() : x(0), y(0) {} // 1 Point(int a, int b) : x(a), y(b) {} // 2 // 복사 생성자 : 자신과 동일 타입 객체를 인자로 받는 생성자 // 사용자가 만들지 않으면 컴파일러가 제공해 준다 Point(const Point& pt) : x(pt.x), y(pt.y) { std::cout 임시객체가 생성되면서 복사 생성자 호출. class Point { int x, y; public: Point() : x(0), y(0) {} Point(int a, int b) : x(a), y(b) {} Point(const Point& pt) : x(pt.x)..
explicit이란 명시적이다, 명확하다는 의미를 지니고 있다. // 10_explicit #include class OFile { FILE* file; public: // explicit 생성자 : 직접 초기화시에만 사용가능하고 // 복사 초기화에서는 에러. explicit OFile(const char* name, const char* mode = "wt") { file = fopen(name, mode); } // C++기본 : 생성자에서 자원 획득하면 소멸자에서 자원 반납. ~OFile() { fclose(file); } }; // 함수인자를 전달하는 것은 "복사 초기화" 구문 입니다. void foo(OFile f) // OFile f = "hello" { } int main() { OFile ..
C언어를 해본 사람은 알겠지만, 초기화와 대입은 얼핏 보면 비슷하지만, 실제로는 매우 다르다. 예를 들어 const int ca = 3; const int cb; cb = 2; 와 같이 초기화로만 값 지정이 가능하고 대입으로는 값 지정이 불가능한 경우도 있다. // 9_초기화리스트1 85page ~ #include class Point { int x, y; public: //Point(int a = 0) : x(a) {} Point(int a = 0, int b = 0) : x(a), y(b) // 초기화리스트. 대입이 아니라 초기화 { x = a; // 대입 y = b; } }; int main() { Point pt(0, 0); int a = 0; // 초기화. 만들면서 넣기 // a가 class t..
// 8_생성자1 #include class Point { int x, y; public: // 특징 1. 클래스이름과 동일 // 2. 반환타입을 표기하지 않는다. // 3. 오버로딩 가능(2개 이상 만들수있다.) // 4. 객체를 생성하면 생성자가 호출된다. // 5. 사용자가 한개도 만들지 않으면 컴파일러가 // 인자 없는 생성자를 한개 만들어준다 - 디폴트 생성자 //Point() { x = 0; y = 0; std::cout
// 7_접근지정자 74page ~ // 멤버 데이타를 private 에 놓아서 // 외부의 잘못된 접근으로 객체의 상태가 불안해 지는 // 것을 막는다! // "캡슐화(encapsulation)", "정보 은닉" struct Bike { private: int gear; public: Bike(int n = 1) { if ( n > 0) gear = n; } void changeGear(int n) { if ( n > 0 ) gear = n; } }; int main() { // Bike b = { 5 }; // C 스타일의 초기화는 멤버 데이타가 // public 인 경우만 가능.. Bike b(5); //b.gear = -10; b.changeGear(-10); } C++에서는 정보 은닉 기능을 지..