목록All (635)
Brise
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++에서는 정보 은닉 기능을 지..
// 6_STL #include #include #include #include int main() { // char s1[10] = "hello"; // char s2[10] = "hello"; // if (s1 == s2) {} // C++ string 클래스 - 문자열을 다루는 타입 std::string s1 = "hello"; std::string s2 = "hello"; if (s1 == s2) {} // ok // 동적 배열 std::vector v(10, 0); // 10개를 0으로 초기화 v[0] = 3; // 사용법은 배열과 동일 v.resize(15); // 크기 변경도 가능 for (auto& n : v) std::cout
절차적 프로그래밍과 OOP의 차이를 알아보기 위하여 Stack 예제를 다루어 보자. // 5_Stak1 - 60 page ~ #include // 스택을 만들어 봅시다. // 버전 1. C언어 // 단점 : 스택이 2개 이상 필요하다면.... int buff[10]; int idx = 0; void push(int a) { buff[idx++] = a;} int pop() { return buff[--idx]; } int main() { push(10); push(20); std::cout idx)++] = a; } int pop(Stack* s) { return s->buff[--(s->idx)]; } int main() { Stack s1; s1.idx = 0; Stack s2; s2.idx = 0;..