전체 글
[C++] 객체의 복사 방법
1. 객체의 복사 방법 #include #include class Person { char* name; int age; public: Person(const char* n, int a) : age(a) { name = new char[strlen(n) + 1]; strcpy(name, n); } ~Person() { delete name; } }; int main() { Person p1("kim", 20); Person p2 = p1; } ① 얕은 복사란? (Shallow Copy) => 클래스 안에 포인터 멤버가 있을 때 디폴트 복사 생성자가 => 메모리 자체를 복사하지 않고 주소만 복사 하는 현상 #include #include class Person { char* name; int age; pub..
[C++] 복사 생성자 (copy constructor)
1. 복사 생성자 (Copy Constructor) #include class Point { public: int x; int y; Point() : x(0), y(0) {} Point(int a, int b) : x(a), y(b) {} }; int main() { Point p1; // Point() 생성자 ok Point p2(1, 2); // Point(int a, int b) 생성자 ok Point p3(1); // Point(int a) 생성자 error Point p4(p2); // Point(Point p) 생성자 ok } 위의 코드에서 Point p4(p2); 의 경우 생성자가 없으니 error가 나야 할 것 같지만 막상 컴파일 해보면 에러 없이 정상 실행 된다. 그 말은, Point 클..
[C++] explicit 생성자
1. explicit 생성자(1) #include 특정 클래스 설계 시 복사 초기화를 사용하지 못하게 하는 것이 좋을 때가 있다. - 이제 아래에서 위의 코드의 문제를 해결해보자. 2. explicit 생성자(2) #include 아무 문제 없이 컴파일 된다. => 생성자가 explicit가 아니다. ② vector => 복사 초기화를 하면 에러가 난다. => 생성자가 explicit이다. => v3는 문제 없이 컴파일 된다. : v2에서 호출되는 생성자와 v3에서 호출되는 생성자는 다른 생성자다. ③ C++ 표준 스마트 포인터 => 복사 초기화를 하면 에러가 난다. => 생성자가 explicit이다.
[C++] 초기화 리스트 (member initializer list)
1. 멤버 초기화 리스트 (member initializer lists) #include class Point { int x; int y; public: Point(int a, int b) : x(a), y(b) { // 멤버 초기화 리스트 // x = a; // y = b; } }; int main() { Point p(1, 2); //-- class a = 0; // 초기화. 생성자 호출 class b; // 생성자 호출 b = 0; // 대입. 대입연산자 호출 } ① 멤버 초기화 리스트란? => 생성자 괄호 ( ) 뒤에 콜론(:)을 표기하고 멤버를 초기화 하는 것 ② 특징 => 대입(assignment)이 아닌 초기화(initialization) 2. 반드시 멤버 초기화 리스트를 사용해야 하는 경우..
[C++] 소멸자 (destructor)
1. 소멸자 개념 #include class Point { int x, y; public: Point() { std::cout 객체를 생성 하면 생성자가 호출되고 => 객체가 파괴 되면 소멸자가 호출된다. ③ 소멸자를 만들지 않으면 => 컴파일러가 아무 일도 하지 않는 소멸자를 제공해 준다. ④ 소멸자가 필요한 경우 => 생성자 등에서 자원을 할당한 경우, 소멸자에서 자원을 해지 해야 한다. => 자원 해지 등이 필요 없는 경우는 소멸자를 만들 필요는 없다. 2. 소멸자 사용 예제 #include int main() { FILE* f = fopen("a.txt", "wt"); // f = 0; - 변수에 접근할 수 있어 실수할 수 있다. fputs("hello", f); fclose(f); } 위와 같은..
[C++] 생성자 (constructor)
1. 생성자 (constructor) #include using namespace std; class Point { int x, y; public: Point() { x = 0; y = 0; cout 인자는 있어도 되고 없어도 된다. - 2개 이상 만들 수 있다. ③ 객체를 생성하면 => 객체의 크기 만큼 메모리를 할당하고 => 생성자가 호출된다. => 생성자가 없으면 객체를 만들 수 없다. ④ 디폴트 생성자 => 사용자가 생성자를 하나도 만들지 않으면 컴파일러가 인자 없는 생성자를 제공해준다. 2. 객체를 생성하는 다양한 방법 #include using namespace std; class Point { int x, y; public: Point() { x = 0; y = 0; cout 복사 생성자에서..