목록c++ (35)
Brise
객체의 멤버 함수나 멤버 데이터에 접근하려면 클래스 내부에서 각 함수나 변수의 이름을 사용하면 되었다. 사실은 이 경우 실 동작은 컴파일러가 직접 함수 선언에 대하여 내부적으로 this라는 인자를 생성하여 각 객체별로 함수나 변수가 동작하도록 변경하여 동작시키는 구조이다. // 3_this1.cpp 126 page ~ #include class Point { int x, y; public: void set(int a, int b) // set(Point* this, int a, int b) { x = a; // this->x = a; y = b; // this->y = b; 처럼 컴파일 됩니다. // this : 현재 멤버 함수를 호출할때 사용한 객체의 주소 std::cout
C언어에서의 static 변수 또는 static 함수는 정해진 영역 내에서만 고유하게 접근 가능한 변수나 함수를 의미한다. 여기서 정해진 영역이란 파일 또는 중괄호({}) 사이에 위치한 섹션을 의미한다. C++에서는 클래스의 선언(아마 구조체에도 static 선언이 가능할 것으로 보인다. 구조적으로..) 의 멤버변수를 static으로 선언할 수 있는데, 이 경우 해당 클래스를 이용하는 모든 인스턴스의 변수가 통일되어 사용된다. 또한 해당 정적 멤버의 경우 정적으로 할당되기 때문에 정의 영역이 클래스 밖에 위치하게 되며 인스턴스가 생성되기 이전에도 활용할 수 있다. // 2_정적멤버1 - 110 page #include //int cnt = 0; // 전역변수. 모든 객체가 공유 한다. // 어디서나 접근..
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..