C++의 생성자 객체 생성 시 자동으로 호출되는 특수 메서드입니다. 일반적으로 새 객체의 데이터 멤버를 초기화하는 데 사용됩니다. C++의 생성자는 클래스 또는 구조체와 동일한 이름을 갖습니다. 이는 값을 구성합니다. 즉, 객체에 대한 데이터를 제공하므로 생성자라고 합니다.
- 생성자는 클래스 이름과 이름이 동일한 클래스의 멤버 함수입니다.
- 생성자는 동일한 클래스의 객체가 생성될 때 자동으로 클래스 객체의 데이터 멤버를 초기화하는 데 사용되는 특수한 유형의 멤버 함수입니다.
- 생성자는 객체 생성 시 호출됩니다. 이는 값을 구성합니다. 즉, 객체에 대한 데이터를 제공하므로 생성자라고 합니다.
- 생성자는 값을 반환하지 않으므로 반환 유형이 없습니다.
- 클래스의 객체를 생성하면 생성자가 자동으로 호출됩니다.
- 생성자는 오버로드될 수 있습니다.
- 생성자는 가상으로 선언할 수 없습니다.
C++의 생성자 구문
생성자의 프로토타입은 다음과 같습니다.
(list-of-parameters);>
생성자는 클래스 선언 내부 또는 클래스 선언 외부에서 정의될 수 있습니다.
클래스 내 생성자를 정의하기 위한 구문
(list-of-parameters) { // constructor definition }> 클래스 외부에서 생성자를 정의하기 위한 구문
: :(list-of-parameters) { // constructor definition }> C++의 생성자 예
아래 예제에서는 C++에서 클래스의 생성자를 선언하는 방법을 보여줍니다.
예제 1: 클래스 내 생성자 정의
C++
// defining the constructor within the class> #include> using> namespace> std;> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> >// constructor> >student()> >{> >cout <<>'Enter the RollNo:'>;> >cin>>아노;> >cout <<>'Enter the Name:'>;> >cin>> 이름;> >cout <<>'Enter the Fee:'>;> >cin>> 수수료;> >}> >void> display()> >{> >cout << endl << rno <<>' '> << name <<>' '> << fee;> >}> };> int> main()> {> >student s;>// constructor gets called automatically when> >// we create the object of the class> >s.display();> >return> 0;> }> |
>
Sklearn 정확도 점수
>
산출
Enter the RollNo:121 Enter the Name:Geeks Enter the Fee:5000 121 Geeks 5000>
예제 2: 클래스 외부에서 생성자 정의
C++
// defining the constructor outside the class> #include> using> namespace> std;> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> >// constructor declaration only> >student();> >void> display();> };> // outside definition of constructor> student::student()> {> >cout <<>'Enter the RollNo:'>;> >cin>>아노;> >cout <<>'Enter the Name:'>;> >cin>> 이름;> >cout <<>'Enter the Fee:'>;> >cin>> 수수료;> }> void> student::display()> {> >cout << endl << rno <<>' '> << name <<>' '> << fee;> }> // driver code> int> main()> {> >student s;> >s.display();> >return> 0;> }> |
>
>
산출
Enter the RollNo:11 Enter the Name:Aman Enter the Fee:10111 11 Aman 10111>
메모: 클래스 외부에 정의된 생성자를 다음과 같이 만들 수 있습니다. 인라인 클래스 내 정의와 동일하게 만듭니다. 하지만 참고하세요 인라인 컴파일러에 대한 명령이 아니라 상황에 따라 컴파일러가 구현할 수도 있고 구현하지 않을 수도 있는 요청일 뿐입니다.
C++ 생성자의 특성
다음은 C++ 생성자의 몇 가지 주요 특징입니다.
- 생성자의 이름은 클래스 이름과 동일합니다.
- 생성자는 클래스의 비공개 섹션에서도 선언될 수 있지만 대부분 클래스의 공개 섹션에서 선언됩니다.
- 생성자는 값을 반환하지 않습니다. 따라서 반환 유형이 없습니다.
- 클래스의 객체를 생성하면 생성자가 자동으로 호출됩니다.
- 생성자는 오버로드될 수 있습니다.
- 생성자는 가상으로 선언될 수 없습니다.
- 생성자는 상속될 수 없습니다.
- 생성자의 주소는 참조할 수 없습니다.
- 생성자는 다음을 암시적으로 호출합니다. 새로운 그리고 삭제 메모리 할당 중 연산자.
C++의 생성자 유형
생성자는 사용되는 상황에 따라 분류될 수 있습니다. C++에는 4가지 유형의 생성자가 있습니다.
- 기본 생성자
- 매개변수화된 생성자
- 복사 생성자
- 이동 생성자
실제 예를 들어 C++의 생성자 유형을 이해해 보겠습니다. 당신이 마커를 사러 가게에 갔다고 가정해보자. 마커를 구매하고 싶을 때 옵션은 무엇입니까? 먼저 가게에 가서 마커 좀 달라고 하세요. 그래서 마커를 준다는 것은 브랜드 이름과 색상을 설정하지 않았다는 의미이며, 마커를 원한다고 아무 언급도 하지 않았다는 의미입니다. 그래서 우리가 시장이나 그의 상점에 자주 판매되는 마커가 무엇이든 간에 마커를 원한다고 말하면 그는 간단히 그것을 넘겨줄 것입니다. 이것이 바로 기본 생성자입니다!
두 번째 방법은 상점에 가서 XYZ 브랜드의 빨간색 마커를 원한다고 말하는 것입니다. 그래서 당신은 이것을 언급하고 있으며 그는 당신에게 그 마커를 줄 것입니다. 따라서 이 경우에는 매개변수를 제공했습니다. 이것이 바로 매개변수화된 생성자입니다!
그런 다음 세 번째로 상점에 가서 이런 마커(손에 있는 물리적 마커)를 원한다고 말합니다. 그래서 가게 주인은 그 마커를 보게 될 것입니다. 좋아요, 그러면 그는 당신에게 새로운 마커를 줄 것입니다. 그래서 그 마커의 복사본입니다. 이것이 바로 복사 생성자입니다!
이제 새 마커를 구입하지 않고 대신 친구의 마커 소유권을 가져간다고 가정해 보겠습니다. 이는 새 리소스를 얻는 대신 이미 존재하는 리소스의 소유권을 가져오는 것을 의미합니다. 이것이 바로 이동 생성자입니다!
1. C++의 기본 생성자
ㅏ 기본 생성자 인수를 취하지 않는 생성자입니다. 매개변수가 없습니다. 인수가 없는 생성자라고도 합니다.
기본 생성자의 구문
className() { // body_of_constructor }> 기본 생성자의 예
아래 예제에서는 C++에서 기본 생성자를 사용하는 방법을 보여줍니다.
예시 1:
CPP
// C++ program to illustrate the concept of default> // constructors> #include> using> namespace> std;> class> construct {> public>:> >int> a, b;> >// Default Constructor> >construct()> >{> >a = 10;> >b = 20;> >}> };> int> main()> {> >// Default constructor called automatically> >// when the object is created> >construct c;> >cout <<>'a: '> << c.a << endl <<>'b: '> << c.b;> >return> 1;> }> |
>
>산출
a: 10 b: 20>
메모: 생성자를 명시적으로 정의하지 않더라도 컴파일러는 자동으로 기본 생성자를 암시적으로 제공합니다.
예시 2:
C++
// C++ program to demonstrate the implicit default> // constructor> #include> using> namespace> std;> // class> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> };> int> main()> {> >// creating object without any parameters> >student s;> >return> 0;> }> |
>
>
산출
(no output)>
보시다시피, 명시적인 기본 생성자를 정의하지 않은 경우에도 인수를 전달하지 않고도 학생 클래스의 객체를 생성할 수 있습니다.
2. C++의 매개변수화된 생성자
매개변수화된 생성자를 사용하면 생성자에 인수를 전달할 수 있습니다. 일반적으로 이러한 인수는 개체가 생성될 때 개체를 초기화하는 데 도움이 됩니다. 매개변수화된 생성자를 생성하려면 다른 함수에서와 마찬가지로 매개변수를 추가하기만 하면 됩니다. 생성자의 본문을 정의할 때 매개변수를 사용하여 객체를 초기화합니다.
매개변수화된 생성자의 구문
className (parameters...) { // body }> 매개변수화된 생성자의 예
아래 예제에서는 C++에서 매개변수화된 생성자를 사용하는 방법을 보여줍니다.
예제 1: 클래스 내부에 매개변수화된 생성자 정의
CPP
// CPP program to illustrate parameterized constructors> #include> using> namespace> std;> class> Point {> private>:> >int> x, y;> public>:> >// Parameterized Constructor> >Point(>int> x1,>int> y1)> >{> >x = x1;> >y = y1;> >}> >int> getX() {>return> x; }> >int> getY() {>return> y; }> };> int> main()> {> >// Constructor called> >Point p1(10, 15);> >// Access values assigned by constructor> >cout <<>'p1.x = '> << p1.getX()> ><<>', p1.y = '> << p1.getY();> >return> 0;> }> |
>
>산출
p1.x = 10, p1.y = 15>
예제 2: 클래스 외부에서 매개변수화된 생성자 정의
C++
자바 프로그램
// C++ Program to illustrate how to define the parameterized> // constructor outside the class> #include> #include> using> namespace> std;> // class definition> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> >student(>int>,>char>[],>double>);> >void> display();> };> // parameterized constructor outside class> student::student(>int> no,>char> n[],>double> f)> {> >rno = no;> >strcpy>(name, n);> >fee = f;> }> void> student::display()> {> >cout << endl << rno <<>' '> << name <<>' '> << fee;> }> // driver code> int> main()> {> >student s(1001,>'Ram'>, 10000);> >s.display();> >return> 0;> }> |
>
>산출
1001 Ram 10000>
매개변수화된 생성자에서 객체가 선언되면 초기 값이 생성자 함수에 인수로 전달되어야 합니다. 일반적인 객체 선언 방법이 작동하지 않을 수 있습니다. 매개변수화된 생성자는 명시적으로 또는 암시적으로 호출할 수 있습니다.
Example e = Example(0, 50); // Explicit call Example e(0, 50); // Implicit call>
매개변수화된 생성자가 정의되고 기본 생성자가 명시적으로 정의되지 않은 경우 컴파일러는 기본 생성자를 암시적으로 생성하지 않으므로 다음과 같이 간단한 개체를 생성합니다.
Student s;>
오류가 깜박입니다.
예시 3:
C++
// C++ Program to illustrate the error caused be not> // defining the explicit defualt constructor after> // parameterized constructor> #include> #include> using> namespace> std;> // class definition> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> >student(>int> no,>char> n[],>double> f)> >{> >rno = no;> >strcpy>(name, n);> >fee = f;> >}> };> // driver code> int> main()> {> >student s;>// this will cause error> >return> 0;> }> |
>
>
숨겨진 앱을 공개하는 방법
산출
main.cpp: In function ‘int main()’: main.cpp:25:13: error: no matching function for call to ‘student::student()’ 25 | student s; // this will cause error | ^ main.cpp:14:5: note: candidate: ‘student::student(int, char*, double)’ 14 | student(int no, char n[], double f) | ^~~~~~~ main.cpp:14:5: note: candidate expects 3 arguments, 0 provided main.cpp:8:7: note: candidate: ‘constexpr student::student(const student&)’ 8 | class student { | ^~~~~~~ main.cpp:8:7: note: candidate expects 1 argument, 0 provided main.cpp:8:7: note: candidate: ‘constexpr student::student(student&&)’ main.cpp:8:7: note: candidate expects 1 argument, 0 provided ^~> 중요 사항: 클래스에 대해 하나 이상의 기본 생성자가 아닌 생성자(매개 변수 포함)를 정의할 때마다 기본 생성자(매개 변수 없음)도 명시적으로 정의해야 합니다. 이 경우 컴파일러는 기본 생성자를 제공하지 않기 때문입니다. 그러나 반드시 필요한 것은 아니지만 항상 기본 생성자를 정의하는 것이 가장 좋은 방법으로 간주됩니다.
매개변수화된 생성자의 사용
- 다양한 개체의 다양한 데이터 요소를 생성할 때 서로 다른 값으로 초기화하는 데 사용됩니다.
- 생성자를 오버로드하는 데 사용됩니다.
C++ 매개변수화된 생성자의 기본 인수
일반 함수와 마찬가지로 매개변수화된 생성자의 인수에 대한 기본값을 정의할 수도 있습니다. 모든 규칙은 기본 인수 이 매개변수에 적용됩니다.
예 3: 기본값을 사용하여 매개변수화된 생성자 정의
C++
// C++ Program to illustrate how to use default arguments> // with parameterized constructor> #include> using> namespace> std;> // class> class> GFG {> private>:> >int> data;> public>:> >// parameterized constructor with default values> >GFG(>int> x = 0) { data = x; }> >int> getData() {>return> data; }> };> int> main()> {> >GFG obj1;>// will not throw error> >GFG obj2(25);> >cout <<>'First Object Data: '> << obj1.getData() << endl;> >cout <<>'Second Object Data: '> << obj2.getData()> ><< endl;> >return> 0;> }> |
>
>산출
First Object Data: 0 Second Object Data: 25>
보시다시피, 매개변수화된 생성자의 모든 인수에 기본값이 할당되면 기본 생성자와 마찬가지로 매개변수를 전달하지 않고 객체를 생성하는 것이 합법적입니다. 따라서 이 유형의 생성자는 기본 생성자와 매개변수화된 생성자 모두로 작동합니다.
3. C++의 복사 생성자
복사 생성자는 동일한 클래스의 다른 개체를 사용하여 개체를 초기화하는 멤버 함수입니다.
구문 복사 생성자
복사 생성자 인수와 동일한 클래스의 객체에 대한 참조를 취합니다.
ClassName (ClassName &obj) { // body_containing_logic }> 기본 생성자와 마찬가지로 C++ 컴파일러는 명시적 복사 생성자 정의가 없는 경우 암시적 복사 생성자를 제공합니다. 여기서는 명시적 생성자가 있으면 암시적 기본 생성자가 삭제되는 기본 생성자와 달리 명시적 복사 생성자가 없는 경우 암시적 복사 생성자는 항상 컴파일러에 의해 생성된다는 점에 유의해야 합니다. 또는 명시적인 이동 생성자가 있습니다.
복사 생성자의 예
아래 예제에서는 C++에서 복사 생성자를 사용하는 방법을 보여줍니다.
예 1: 암시적 복사 생성자 그림
C++
// C++ program to illustrate the use of Implicit copy> // constructor> #include> using> namespace> std;> class> Sample {> >int> id;> public>:> >// parameterized constructor> >Sample(>int> x) { id = x; }> >void> display() { cout <<>'ID='> << id; }> };> int> main()> {> >Sample obj1(10);> >obj1.display();> >cout << endl;> >// creating an object of type Sample from the obj> >Sample obj2(obj1);>// or obj2=obj1;> >obj2.display();> >return> 0;> }> |
>
>산출
ID=10 ID=10>
예 2: 명시적 복사 생성자 정의
C++
// C++ Program to demonstrate how to define the explicit> // copy constructor> #include> using> namespace> std;> class> Sample {> >int> id;> public>:> >// default constructor with empty body> >Sample() {}> >// parameterized constructor> >Sample(>int> x) { id = x; }> >// copy constructor> >Sample(Sample& t) { id = t.id; }> >void> display() { cout <<>'ID='> << id; }> };> // driver code> int> main()> {> >Sample obj1(10);> >obj1.display();> >cout << endl;> >// copy constructor called> >Sample obj2(obj1);>// or obj2=obj1;> >obj2.display();> >return> 0;> }> |
>
글꼴 크기 라텍스
>산출
ID=10 ID=10>
예 3: 매개변수화된 생성자를 사용하여 명시적 복사 생성자 정의
C++
// C++ program to demonstrate copy construction along with> // parameterized constructor> #include> #include> using> namespace> std;> // class definition> class> student {> >int> rno;> >char> name[50];> >double> fee;> public>:> >student(>int>,>char>[],>double>);> >student(student& t)>// copy constructor> >{> >rno = t.rno;> >strcpy>(name, t.name);> >fee = t.fee;> >}> >void> display();> };> student::student(>int> no,>char> n[],>double> f)> {> >rno = no;> >strcpy>(name, n);> >fee = f;> }> void> student::display()> {> >cout << endl << rno <<>' '> << name <<>' '> << fee;> }> int> main()> {> >student s(1001,>'Manjeet'>, 10000);> >s.display();> >student manjeet(s);>// copy constructor called> >manjeet.display();> >return> 0;> }> |
>
>산출
1001 Manjeet 10000 1001 Manjeet 10000>
복사 생성자의 사용
- 기존 개체의 값을 복사하여 새 개체를 생성합니다.
- 깊은 복사를 수행하는 데 사용할 수 있습니다.
- 필요한 경우 복사 프로세스 중에 특정 속성을 수정합니다.
4. C++에서 생성자 이동
이동 생성자는 C++의 생성자 제품군에 최근 추가된 것입니다. 이는 이미 존재하는 객체로부터 객체를 생성하는 복사 생성자와 비슷하지만 새 메모리에 객체를 복사하는 대신 이동 의미론을 사용하여 추가 생성 없이 이미 생성된 객체의 소유권을 새 객체로 이전합니다. 사본.
이는 다른 개체의 리소스를 훔치는 것으로 볼 수 있습니다.
C++의 이동 생성자 구문
className (className&& obj) { // body of the constructor }> 그만큼 이동 생성자 걸립니다 rvalue 참조 동일한 클래스의 객체를 삭제하고 이 객체의 소유권을 새로 생성된 객체에 이전합니다.
복사 생성자와 마찬가지로 컴파일러는 명시적인 이동 생성자가 없는 각 클래스에 대해 이동 생성자를 만듭니다.
이동 생성자의 예
아래 예제에서는 C++에서 이동 생성자를 사용하는 방법을 보여줍니다.
예 1: 이동 생성자 정의
C++
// C++ Program to illustrate how to define a move> // constructor> #include> using> namespace> std;> class> Box {> public>:> >int>* data;>// Pointer to an integer value> >// Constructor> >Box(>int> value)> >{> >data =>new> int>;> >*data = value;> >}> >// Move constructor> >Box(Box&& other) noexcept> >{> >cout <<>'Move Constructor Called'> << endl;> >data = other.data;>// Transfer ownership of 'other'> >// data> >other.data = nullptr;>// Null out 'other' to prevent> >// double deletion> >}> >// Destructor> >~Box() {>delete> data; }> };> int> main()> {> >// Create a Box with value 42> >Box originalBox(42);> >// Create a new Box by moving resources from the> >// originalBox> >Box newBox(move(originalBox));> >cout <<>'newBox.data: '> << *newBox.data;> >// originalBox is now in a valid but unspecified> >// state (its resources were moved to newBox)> >return> 0;> }> |
>
>산출
Move Constructor Called newBox.data: 42>
이동 생성자의 사용
- 복사본을 만드는 대신 이동 생성자는 이러한 리소스의 소유권을 효율적으로 이전합니다.
- 이는 불필요한 메모리 복사를 방지하고 오버헤드를 줄여줍니다.
- 특정 리소스 전송을 처리하기 위해 자체 이동 생성자를 정의할 수 있습니다.
C++의 소멸자
소멸자는 생성자로서의 특별한 멤버 함수이기도 합니다. 소멸자는 생성자가 만든 클래스 객체를 파괴합니다. 소멸자는 클래스 이름과 이름이 같고 앞에 물결표(~) 기호가 붙습니다. 둘 이상의 소멸자를 정의하는 것은 불가능합니다. 소멸자는 생성자가 만든 객체를 파괴하는 한 가지 방법일 뿐입니다. 따라서 소멸자는 오버로드될 수 없습니다. 소멸자는 인수가 필요하지 않으며 값도 반환하지 않습니다. 객체가 범위를 벗어나면 자동으로 호출됩니다. 소멸자는 생성자가 만든 객체가 차지하는 메모리 공간을 해제합니다. ~ 안에 파괴자 , 객체 생성과 반대로 객체가 파괴됩니다.
C++의 소멸자 구문
생성자와 마찬가지로 소멸자도 클래스 내부 또는 외부에서 정의할 수 있습니다.
클래스 내에서 소멸자를 정의하는 구문
~ (){}> 클래스 외부에서 소멸자를 정의하는 구문
: : ~(){}> C++의 소멸자 예
아래 예제에서는 C++에서 소멸자를 사용하는 방법을 보여줍니다.
예제 1: 단순 소멸자 정의
CSS 이미지 중앙 정렬
C++
#include> using> namespace> std;> class> Test {> public>:> >Test() { cout <<>'
Constructor executed'>; }> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }> |
>
>산출
Constructor executed Destructor executed>
예제 2: 객체가 생성되고 파괴되는 횟수 계산
C++
// C++ Program to count the number of objects created and> // destroyed> #include> using> namespace> std;> // global variable to count> int> count = 0;> // class definition> class> Test {> public>:> >Test()> >{> >count++;> >cout <<>'No. of Object created: '> << count << endl;> >}> >~Test()> >{> >cout <<>'No. of Object destroyed: '> << count> ><< endl;> >--count;> >}> };> // driver code> int> main()> {> >Test t, t1, t2, t3;> >return> 0;> }> |
>
>
산출
No. of Object created: 1 No. of Object created: 2 No. of Object created: 3 No. of Object created: 4 No. of Object destroyed: 4 No. of Object destroyed: 3 No. of Object destroyed: 2 No. of Object destroyed: 1>
C++ 소멸자의 특성
다음은 C++ 소멸자의 몇 가지 주요 특징입니다.
- 소멸자는 해당 생성자가 범위를 벗어나 프로그램에 더 이상 필요하지 않은 메모리 공간을 해제할 때 컴파일러에 의해 자동으로 호출됩니다.
- 소멸자는 인수가 필요하지 않으며 값도 반환하지 않으므로 오버로드될 수 없습니다.
- 소멸자는 static 및 const로 선언할 수 없습니다.
- 소멸자는 프로그램의 공개 섹션에 선언되어야 합니다.
- 소멸자는 생성자 호출의 역순으로 호출됩니다.
C++ 생성자에 대해 자주 묻는 질문
명시적으로 제공하지 않는 경우 컴파일러에서 기본적으로 생성되는 함수는 무엇입니까?
명시적으로 제공하지 않는 경우 기본적으로 컴파일러에서 생성되는 함수는 다음과 같습니다.
- 기본 생성자
- 복사 생성자
- 생성자 이동
- 할당 연산자
- 파괴자
생성자를 비공개로 만들 수 있나요?
예, C++에서는 생성자를 비공개로 설정할 수 있습니다. 이는 외부 코드가 해당 클래스의 객체를 직접 생성할 수 없음을 의미합니다.
생성자는 일반 멤버 함수와 어떻게 다릅니까?
생성자는 다음과 같은 점에서 일반 함수와 다릅니다.
- 생성자는 클래스 자체와 이름이 동일합니다.
- 기본 생성자에는 입력 인수가 없지만 복사 및 매개변수화된 생성자에는 입력 인수가 있습니다.
- 생성자에는 반환 유형이 없습니다.
- 생성자는 객체가 생성될 때 자동으로 호출됩니다.
- 클래스의 공개 섹션에 배치해야 합니다.
- 생성자를 지정하지 않으면 C++ 컴파일러는 객체에 대한 기본 생성자를 생성합니다(매개변수가 없고 본문이 비어 있음).
클래스에 하나 이상의 생성자를 가질 수 있나요?
예, 클래스에는 생성자가 두 개 이상 있을 수 있습니다. 그것은이라고 생성자 오버로딩 .
관련 기사:
- C++의 소멸자
- C++의 생성자에 관한 퀴즈
- C++ 프로그램의 출력 | 세트 26(생성자)
- C++ 프로그램의 출력 | 세트 27(생성자와 소멸자)