관리 메뉴

JIE0025

[ C++ ] 이니셜라이저를 이용한 멤버 초기화 본문

기타 학습/Language

[ C++ ] 이니셜라이저를 이용한 멤버 초기화

Kangjieun11 2022. 5. 17. 13:53
728x90

 

객체 생성 과정에서 생성자 호출이 객체의 초기화를 수월하게 하는데 

 

만약 class A 에서 B라는 객체를 멤버로 갖고 있다면 

A가 생성될 떄 B class 생성자를 통해 B객체를 초기화 할순 없을까?

 

멤버 이니셜라이저를 이용하면 위의 것을 할 수 있다고 한다. 

 

class Rectangle {
private:
	Point upLeft;
	Point lowRight;
public:
	Rectangle(const int& x1, const int& y1, const int& x2, const int& y2);
	void ShowRecInfo() const;
};

Rectangle::Rectangle(const int& x1, const int& y1, const int& x2, const int& y2)
	: upLeft(x1, y1), lowRight(x2, y2)   // 멤버 이니셜라이저 부분 >> 객체 upLeft 생성할 때 x1,y1을 인자로 전달받는 생성자 호출
{

}

 

 

예제

#include <iostream>

using namespace std;
class Point {
private:
	int x;
	int y;
public:
	Point(const int& xpos, const int& ypos);
	int GetX() const;
	int GetY() const;
	bool SetX(int xpos);
	bool SetY(int ypos);
};
Point::Point(const int& xpos, const int& ypos) {
	x = xpos;
	y = ypos;
}
int Point::GetX() const { return x; }
int Point::GetY() const { return y; }
bool Point::SetX(int xpos){
	if (0 > xpos || xpos > 100) {
		cout << "범위와 벗어난 값 전달" << '\n';
	}
	x = xpos;
	return true;
}
bool Point::SetY(int ypos) {
	if (0 > ypos || ypos > 100) {
		cout << "범위와 벗어난 값 전달" << '\n';
	}
	y = ypos;
	return true;
}

class Rectangle {
private:
	Point upLeft;
	Point lowRight;
public:
	Rectangle(const int& x1, const int& y1, const int& x2, const int& y2);
	void ShowRecInfo() const;
};

Rectangle::Rectangle(const int& x1, const int& y1, const int& x2, const int& y2)
	: upLeft(x1, y1), lowRight(x2, y2)   // 멤버 이니셜라이저 부분 >> 객체 upLeft 생성할 때 x1,y1을 인자로 전달받는 생성자 호출
{

}

void Rectangle::ShowRecInfo() const {
	cout << "좌 상단 : " << upLeft.GetX() <<", " <<upLeft.GetY() << '\n';
	cout << "우 하단 : " << lowRight.GetX() << ", "<< lowRight.GetY() << '\n';

}
int main() {

	Rectangle r1(1, 1, 5, 5);
	r1.ShowRecInfo();

	return 0;
}

 

 

 

객체의 생성

1) 메모리 공간의 할당

2) 이니셜 라이저를 이용한 멤버변수의 초기화

3) 생성자의 몸체 부분 실행

만약 이니셜라이저가 없으면 메모리공간할당과 몸체 부분의 실행만으로 객체는 생성된다. 

 

 

 

 이니셜 라이저를 이용한 멤버변수의 초기화

이전 글에서  FruitSeller 를 생성하는 다른 방법을 사용했었다. 

이건 이니셜 라이저를 이용한 멤버변수의 초기화하는 방법이다. .

	//this 키워드를 사용하지 않은 축약된 작성법
	FruitSeller(int price, int num, int money) : APPLE_PRICE(price), numOfApples(num), myMoney(money) {}

APPLE_PRICE라는 멤버 변수가 있는데 그 값을 매개변수로 들어온 값인 price로 초기화 하라는 의미..!

 

일반 생성자의 경우 아래처럼 멤버 초기화를 하는데 

private: 
	int APPLE_PRICE;

public:
	FruitSeller (int price){
      APPLE_PRICE = price
    }

이럴경우

int APPLE_PRICE; 

APPLE_PRICE = price;

처럼 선언 이후 대입연산을 사용해 초기화 했다면

 

이니셜라이저를 이용할경우 선언과 동시에 초기화가 된다. (바이너리 코드가 생성)

 

 

const 변수의 경우 선언과 동시에 초기화 해야하는 특징이 있다. 

그래서 당연히 const 멤버변수도 이니셜라이저를 이용시 초기화가 가능하다.

 

그렇다면 참조자는? 

참조자도 선언과 동시에 초기화가 이뤄져야 하므로

참조자또한 멤버변수로 선언될수 있다.