본문 바로가기
Programming/c++ Design Pattern

c++ 생성자

by 드가보자 2023. 11. 28.

 

우선 예시 코드부터 살펴보자.

 

#include <string>
#include <iostream>

class Person
{
	std::string name;
	int age;
public:
	Person(const std::string& name, int age) : name(name), age(age){}
};

class Student : public Person
{
	int id;
public:
	Student(const std::string& name, int age, int id) :Person(name, age), id(id){} 
};

int main()
{

	Student s("kim", 28, 15); 

	Person p1("kim", 28);

}

 

Class Person은 string name과, int age 2가지의 멤버 변수를 가진다.

Person(const std::string& name, int age) : name(name), age(age){} 해당 line으로 멤버 변수를 초기화 해주는 생성자 line이다.

여기서 name(name) 에서 앞에 name은 멤버 변수 name을 나타내고, (name)은 생성자 함수에서 전달받은 const std::string& name을 나타낸다. 

즉 멤버 변수 name에 const std::string& name를 입력해주는 것이다.

 

c++을 공부한지 얼마 되지 않아서 나는 student를 초기화 할때에는 id 값만 주면 되는 줄 알았는데,

부모 클래스(기반 클래스) 의 멤버 변수들 또한 초기화 해주어야 하는 것이다.

 

그리고 또 하나의 호기심이 있었는데, 

Student(const std::string& name, int age, int id) :Person(name, age), id(id){} 해당 line이다.

여기서 왜 const std::string& name ? &얘는 왜 쓰는 것이지 라고 생각을 했는데

&를 해주지 않으면, name을 복사 한 뒤에 해당하는 값을 입력해주는 것이라고 한다.

 

복사를 한다 -> 결국 불필요한 Memory를 낭비하는 것이라고 이해할 수 있다. 

 

다음 Student s와 Person p1을 생성해줬는데, 만약 생성자 함수를 사용하지않고 Person p1 이렇게 정의한다면

age와 name에는 초기화되지 않은 객체가 생성된 것이다. -> 안정성이 많이 떨어지는 코드 

 

class에서는 접근 제어 지시자는 대략적으로 public, private, protected가 있다.

class에서 딱히 public이나 protected로 접근 제어 지시자를 지정해주지 않으면 Default로 private으로 사용한다. 

 

  1. Private 
    해당 클래스 내부에서만 접근이 가능, 외부에서는 접근 할 수 없음.
    주로 class의 세부 구현 사항들을 감추고, 외부에서 접근하지 못하게 하기위해 사용 -> 안정성 

  2. Public 
    Private과 반대로 외부에서 class 멤버 변수로 접근이 가능하다.
  3. Protected
    파생 class 들은 접근이 가능하지만, 외부에서는 접근할 수 없다. 
    주로 상속 관계에서 기반 class의 일부 멤버를 파생 class에서 사용할 수 있도록 하는데 사용된다.

 

 

 

 

'Programming > c++ Design Pattern' 카테고리의 다른 글

[c++ Design Pattern] Template Method  (0) 2023.11.29
[C++] OCP Code 예제  (1) 2023.11.29
[C++] 추상 클래스  (0) 2023.11.29
[C++] 가상 함수  (1) 2023.11.28
[c++] Upcasting  (0) 2023.11.28