English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서에서는 C ++의 생성 함수. 생성 함수는 무엇인지, 어떻게 생성하는지, C ++의 생성 함수 타입.
생성 함수는 객체를 생성할 때 특별한 멤버 함수입니다.객체생성될 때 자동으로 초기화됩니다.
컴파일러는 이름과 반환 타입을 통해 주어진 멤버 함수를 생성 함수로 인식합니다.
생성 함수는 해당 클래스와 같은 이름을 가지고 있으며, 어떤 반환 타입도 없습니다. 또한, 생성 함수는 항상 공공의 것입니다.
... .. ... class temporary { private: int x; float y; public: // 구조 함수 temporary(): x(5), y(5.5) { // 생성 함수 본체 } ... .. ... }; int main() { Temporary t1; ... .. ... }
위의 프로그램은 정의된 생성 함수를 보여주며, 반환 타입이 없고 이름이 클래스와 같습니다.
위의 코드에서 temporary()는 생성 함수입니다.
클래스의 객체를 생성할 때, 자동으로 생성 함수 temporary가 호출되고, x를 초기화합니다.5그런 다음 y를 초기화합니다.5.5.
또한, 구조 함수 내의 데이터 멤버를 다음과 같이 초기화할 수 있습니다. 하지만, 이 방법은 권장되지 않습니다.
temporary() { x = 5; y = 5.5; } // 이 방법은 선호되지 않습니다.
당신이 다음과 같은 경우를 처리하고 있다고 가정해 보겠습니다100개의 Person 객체를 가지고 있으며, 데이터 멤버 age의 기본 값은 0입니다. 모든 객체를 수동으로 초기화하는 것은 매우 복잡한 작업입니다.
반대로, age를 0으로 초기화한 구조 함수를 정의할 수 있습니다. 그런 다음, Person 객체를 생성하면 구조 함수가 자동으로 age를 초기화합니다.
이러한 경우는 객체 배열을 처리할 때 자주 발생합니다.
다음으로, 객체를 생성한 후 즉시 일부 코드를 실행하려면, 이 코드를 구조 함수의 주체 내에 배치할 수 있습니다.
직사각형의 면적을 계산하고 표시합니다.
#include <iostream> using namespace std; class Area { private: int length; int breadth; public: // 구조 함수 Area(): length(5), breadth(2){} void GetLength() { cout << "길이와 너비를 각각 입력하십시오: "; cin >> length >> breadth; } int AreaCalculation() { return (length * breadth);} void DisplayArea(int temp) { cout << "면적: " << temp; } }; int main() { Area A1, A2; int temp; A1.GetLength(); temp = A1.AreaCalculation(); A1.DisplayArea(temp); cout << endl << "사용자에서 값을 가져오지 않을 때의 기본 면적은:" << endl; temp = A2.AreaCalculation(); A2.DisplayArea(temp); return 0; }
이 프로그램에서는 Area와 관련된 함수를 처리하기 위해 Area 클래스를 생성합니다. 이 클래스는 두 개의 데이터 멤버인 length와 breadth를 가집니다.
길이(length)를 초기화한5와 너비(breadth)를2의 구조 함수.
GetLength(), AreaCalculation(), DisplayArea()라는 세 가지 추가 멤버 함수를 가지고 있습니다. 각각 사용자에서 길이를 가져오고, 면적을 계산하고, 면적을 표시합니다.
객체 A를 생성할 때1와 A2을 초기화합니다. 구조 함수의 관계로 인해 이 두 객체의 길이(length)와 너비(breadth)는 각각5와2.
그런 다음, GetLength() 멤버 함수를 호출하여 사용자에서 객체 A1의 길이(length)와 너비(breadth) 값을 변경합니다. 이는 객체 A1의 길이(length)와 너비(breadth)를 계산합니다.
그런 다음, AreaCalculation() 함수를 호출하여 객체 A1그 면적을 변수 temp에 저장하고 마지막으로 표시합니다.
객체 A에 대해2사용자가 어떤 데이터도 제공하지 않도록 요구하지 않습니다. 따라서, 길이(length)와 너비(breadth)는 각각 유지됩니다5와2.
그런 다음, A를 계산하고 표시합니다.2면적은10.
출력 결과
길이와 너비를 각각 입력하십시오: 6 7 면적: 42 사용자에서 값을 가져오지 않을 때의 기본 면적은 면적: 10
구조 함수는 유사하게함수 오버로드방식으로 오버로드됩니다.
오버로드된 생성자는 같은 이름(클래스 이름)을 가지지만 파라미터 개수가 다릅니다.
전달된 파라미터의 개수와 유형에 따라 특정 생성자가 호출됩니다.
여러 생성자가 존재하기 때문에, 객체를 생성할 때 생성자의 파라미터도 전달해야 합니다.
// 소스 코드는 생성자 오버로드 작동 원리를 보여줍니다 #include <iostream> using namespace std; class Area { private: int length; int breadth; public: // 파라미터가 없는 생성자 Area(): length(5), breadth(2) { // 파라미터가 두 개인 생성자 Area(int l, int b): length(l), breadth(b){} void GetLength() { cout << "길이와 너비를 각각 입력하세요: "; cin >> length >> breadth; } int AreaCalculation() { return length * breadth;} void DisplayArea(int temp) { cout << "면적: " << temp << endl; } }; int main() { Area A1, A2(2, 1); int temp; cout << "파라미터가 전달되지 않았을 때의 디폴트 면적. " << endl; temp = A1.AreaCalculation(); A1.DisplayArea(temp); cout << "(2,1)를 파라미터로 전달될 때의 면적. " << endl; temp = A2.AreaCalculation(); A2.DisplayArea(temp); return 0; }
객체 A에 대해1생성자에 어떤 파라미터도 전달되지 않습니다.
따라서, 파라미터가 없는 생성자가 호출됩니다. 이 생성자는 길이(length)를 초기화합니다.5너비(breadth)를 초기화합니다.2따라서, 객체 A1의 면적은10.
객체 A에 대해2을 사용하여 객체를 생성할 때2와1로 전달됩니다.
따라서, 두 파라미터를 가진 생성자가 호출됩니다. 이 생성자는 길이(length)를 l(이 경우에)로 초기화합니다.2),너비(breadth)를 b(이 경우에)로 초기화합니다.1따라서, 객체 A2의 면적은2.
출력 결과
파라미터가 전달되지 않았을 때의 디폴트 면적. 면적: 10 (2,1파라미터로 전달될 때의 면적. 면적: 2
객체는 같은 유형의 다른 객체로 초기화될 수 있습니다. 이는 클래스의 내용을 다른 클래스에 복사하는 것과 같습니다.
위의 프로그램에서 객체 A를 초기화하려면3를 포함하도록 만듭니다2동일한 값을 이렇게 실행할 수 있습니다:
.... int main() { Area A1, A2(2, 1); // A를2의 내용을 A에 복사합니다3 Area A3(A2); 또는, Area A3 = A2; }
이 작업을 수행하기 위해 새로운 생성자를 생성해야 할 것 같지만, 추가적인 생성자는 필요하지 않습니다. 이는 기본적으로 모든 클래스에 내장된 복사 생성자 때문입니다.