<생성자>
생성자는 객체가 생성될 때 자동으로 호출되는 멤버 함수입니다.
클래스 이름과 같아야 하고, 함수의 반환값은 없습니다.
public 접근 속성을 가져야 하고, 객체 생성과 동시에 멤버 변수들을 초기화 할 때 사용됩니다.
생성자를 따로 정의하지 않았을 경우, 매개 변수가 없고, 아무 기능도 하지 않는 디폴트 생성자가 자동으로 만들어집니다.
(매개 변수가 있는 생성자를 정의할 시 디폴트 생성자가 자동으로 생성되지 않아서 인자 없이 객체를 생성하지 못하므로, 꼭 인자를 주어 객체를 만들거나, 따로 디폴트 생성자를 만들어줘야 합니다. ex) Student(){} )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #pragma once #ifndef _STUDENT1_H_ #include <iostream> using namespace std; class Student { public: Student(); //생성자 void setScore(const int s1, const int s2, const int s3); void showScore(); void sumAvg(); private: int score[3], sum; double avg; }; #else #endif // !_STUDENT1_H_ | cs |
<student1.h>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include "student1.h" Student::Student() //생성자 정의 { score[0] = 0; score[1] = 0; score[2] = 0; sum = 0; avg = 0.; } void Student::setScore(const int s1, const int s2, const int s3) { score[0] = s1; score[1] = s2; score[2] = s3; } void Student::sumAvg() { int i; for (i = 0; i < 3; ++i) { sum += score[i]; } avg = sum / 3; } void Student::showScore() { int i; for (i = 0; i < 3; ++i) cout << "점 수 " << i + 1 << " : " << score[i] << endl; cout << "총 점 : " << sum << endl; cout << "평 균 : " << avg << endl; } | cs |
<student1.cpp>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include "student1.h" int main() { Student p1; //객체 생성시 생성자 자동 호출 p1.showScore(); //생성자가 없었다면, 멤버 변수가 초기화 되지 않은 상태에서 출력해 쓰레기값 출력 cout << "*******************" << endl; p1.setScore(99, 93, 89); p1.sumAvg(); p1.showScore(); return 0; } | cs |
<student1_main.cpp>
멤버 변수를 초기화 해주는 생성자가 없었을 때.
멤버 변수를 초기화 해주는 생성자가 있을 때.
이렇게 의도치 않은 값을 출력하지 않도록 해줄 수 있습니다.
<생성자 오버로딩>
생성자 역시도 다른 매개변수를 갖는 여러 개의 생성자를 정의하는 것이 가능합니다. 왜냐하면 생성자도 함수이기 때문이죠.
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Student { public: Student(); //생성자 - 객체 생성시 매개변수가 없을 때 자동 호출 Student(const int s1, const int s2, const int s3); //생성자 - 객체 생성시 세 개의 정수형 매개변수가 있을 때 자동 호출 void setScore(const int s1, const int s2, const int s3); void showScore(); void sumAvg(); private: int score[3], sum; double avg; }; | cs |
그래서 아까는 없었던 3개의 정수형 매개변수를 받는 생성자를 선언했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Student::Student() //매개 변수가 없는 생성자 정의 { score[0] = 0; score[1] = 0; score[2] = 0; sum = 0; avg = 0.; } Student::Student(const int s1, const int s2, const int s3) //매개 변수가 있는 생성자 정의 { score[0] = s1; score[1] = s2; score[2] = s3; sum = 0; avg = 0.; } | cs |
그리고 두 생성자를 정의했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include "student1.h" int main() { Student p1; //매개변수 없는 생성자 호출 p1.setScore(99, 93, 89); p1.sumAvg(); p1.showScore(); cout << "*******************" << endl; Student p2(80, 56, 100); //매개변수 있는 생성자 호출 p2.sumAvg(); p2.showScore(); return 0; } | cs |
이렇게 main에서 두 객체를 생성하고 비교해보면, 각각 다른 생성자가 호출됩니다.
객체의 생성과 동시에 원하는 값으로 초기화 할 수 있었습니다.
<생성자 초기화 리스트>
생성자 함수 정의에서 헤더 부분에 콜론을 입력하고 원하는 멤버의 값을 초기화하는 것입니다.
1 2 3 4 5 6 7 | Student::Student(const int s1, const int s2, const int s3) //매개 변수가 있는 생성자 정의 :sum(0), avg(0) { score[0] = s1; score[1] = s2; score[2] = s3; } | cs |
생성자 초기화 리스트는 클래스 상속에서 상속 받은 멤버 변수를 초기화 할 때 사용된다고 합니다.
그리고 메모리에 잡힌 다음에 대입을 하는 것이 아니고, 선언과 동시에 초기화를 하기 때문에 효율적입니다.
const 변수를 초기화 할 때도, const 변수를 만들고 대입하면 error가 발생하기 때문에, 초기화 리스트를 사용해야 합니다.
<복사 생성자>
객체 생성시 이미 생성된 객체의 멤버 변수 값을 복사합니다.
클래스이름 생성할객체(복사할객체);
이렇게 사용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <iostream> using namespace std; class CopyObj { public: CopyObj(const double h, const double w); void showVar(); private: double height; double weight; }; CopyObj::CopyObj(const double h, const double w) { height = h; weight = w; } void CopyObj::showVar() { cout << "키 : " << height << endl; cout << "몸무게 : " << weight << endl; } int main(){ CopyObj p1(181.5, 79.3); //객체 생성 p1.showVar(); cout << "************************" << endl; CopyObj p2(p1); //객체 생성, 복사 생성자 호출 p2.showVar(); return 0; } | cs |
p1이라는 객체를 만들고, p2라는 객체를 생성할 때 인자로 p1 객체를 넘겨줬습니다.
결과는 어떻게 될까요?
p1과 p2의 멤버 변수의 값이 같다는 결과가 나오게 됩니다.
'Programming > C++' 카테고리의 다른 글
[C++] 객체 포인터 (0) | 2018.01.22 |
---|---|
[C++] 소멸자 (0) | 2018.01.22 |
[C++] 클래스와 객체 (2) | 2018.01.22 |
[C++] 함수 오버로딩 (0) | 2018.01.22 |
[C++] 디폴트 매개변수 (0) | 2018.01.22 |