프로그램/C,C++
[C++ 기본 2] 8. 생성자
naudhizb
2022. 3. 2. 23:33
반응형
// 8_생성자1
#include <iostream>
class Point
{
int x, y;
public:
// 특징 1. 클래스이름과 동일
// 2. 반환타입을 표기하지 않는다.
// 3. 오버로딩 가능(2개 이상 만들수있다.)
// 4. 객체를 생성하면 생성자가 호출된다.
// 5. 사용자가 한개도 만들지 않으면 컴파일러가
// 인자 없는 생성자를 한개 만들어준다 - 디폴트 생성자
//Point() { x = 0; y = 0; std::cout << "Point()" << std::endl; }
Point(int a, int b) { x = a; y = b; std::cout << "Point(int, int)" << std::endl; }
};
int main()
{
Point pt1; // 1
//Point pt2(0, 0); // 2
}
C++에서 클래스를 만들 때 생성자를 직접 만들 수 있으며, 만약 생성자를 만들지 않는 경우 컴파일러가 인자가 없는 기본 생성자를 임의로 만들어 준다.
// 8_생성자1
#include <iostream>
class Point
{
int x, y;
public:
Point() { x = 0; y = 0; std::cout << "Point()" << std::endl; }
Point(int a, int b) { x = a; y = b; std::cout << "Point(int, int)" << std::endl; }
};
int main()
{
Point pt1; // 1
Point pt2(0, 0); // 2
Point pt3{ 0, 0 }; // 2번 생성자. C++11의 일관된초기화.
// 직접 초기화
Point pt4 = { 0, 0 }; // 2번, 복사 초기화
Point arr[5]; // 1번 생성자 5번.
Point arr2[5] = { Point(0,0), {1,1} }; // 2번 2회호출
// 1번 3회 호출
// C++98/03 C++11 스타일
Point* p; // 객체 아님. 생성자 호출 안됨.
p = (Point*)malloc(sizeof(Point)); // 생성자 호출안됨.
free(p);
p = new Point; // 메모리 할당 + 1번 생성자 호출 => 객체 생성
delete p;
p = new Point(1, 1); // 2번 생성자, new Point{1,1}
delete p;
}
C++은 다형성을 지원하기 때문에 같은 함수 이름을 가지면서도 서로 다른 인자로 호출하는 것이 가능하다.
클래스, 클래스 포인터에 따라 생성자 인자의 종류에 따라 실제 불리는 생성자가 다르니 사용 시 주의하여야 한다.
반응형