프로그래밍/C++
[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 복사 생성자에서..
[C++] 접근지정자
1. 접근지정자 (access specifiers) struct Book { int code; int price; }; int main() { Book b; b.price = -1000; } 위와 같은 코드가 있다고 해보자. Book이란 구조체는 책의 code번호와 가격 정보를 들고있다. 사용자는 main()함수에서 책을 만들고 책의 가격을 바꾸려고 하는데 사용자가 실수로 '-'를 넣었다고 해보자. 가격은 음수가 될 수 없는데 이러한 실수를 막으려면 어떻게 해야 할까? - 멤버 데이터를 외부에서 직접 접근하면 객체가 잘못된 상태를 가지게 될 수 있다. - 접근지정자를 통해 멤버 함수를 통해서만 멤버 데이터를 변경할 수 있게한다. => 멤버 함수는 인자의 유효성 여부를 조사 할 수 있다. struct Bo..