Programming/C++

[C++] 생성자

Jubil 2018. 1. 22. 17:08
반응형

<생성자>


생성자는 객체가 생성될 때 자동으로 호출되는 멤버 함수입니다.


클래스 이름과 같아야 하고, 함수의 반환값은 없습니다.


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(999389);
    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(999389);
    p1.sumAvg();
    p1.showScore();
 
    cout << "*******************" << endl;
 
    Student p2(8056100); //매개변수 있는 생성자 호출
 
    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.579.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