Program Language/C & C++

[C++] 구조체와 클래스

야곰야곰+책벌레 2022. 1. 3. 19:02
728x90
반응형

구조체는 기본적으로 멤버가 공개되는 클래스다. 따라서 구조체는 멤버 함수를 가질 수 있다. 특히 구조체는 생성자를 가질 수 있다.

struct Points {
	vector<Point> elem;// must contain at least one Point
	Points(Point p0) { elem.push_back(p0);}
	Points(Point p0, Point p1) { elem.push_back(p0); elem.push_back(p1); }
	// ...
};
Points x0; // error : no default constructor
Points x1{ {100,200} }; // one Point
Points x1{ {100,200}, {300,400} }; // two Points

단순히 멤버를 순서대로 초기화하기 위해 성성자를 정의할 필요는 없다.

struct Point {
	int x, y;
};
Point p0; // danger : uninitialized if in local scope (§6.3.5.1)
Point p1 {}; // default construction: {{},{}}; that is {0.0}
Point p2 {1}; // the second member is default constructed: {1,{}}; that is {1,0}
Point p3 {1,2}; // {1,2}

인수 재정렬, 인수 유효성 검증, 인수 수정, 불변 설정 등이 필요한 경우 생성자가 필요하다.

struct Address {
	string name; // "Jim Dandy"
	int number; // 61
	string street; // "South St"
	string town; // "New Providence"
	char state[2]; // ’N’ ’J’
	char zip[5]; // 07974
	Address(const string n, int nu, const string& s, const string& t, const string& st, int z);
};

여기에서 모든 구성원이 초기화되었는지 확인하고 개별 문자를 사용하는 대신 우편 번호에 문자열과 int를 사용할 수 있도록 생성자를 추가했다.

Address jd = {
	"Jim Dandy",
	61, "South St",
	"New Providence",
	"NJ", 7974 // (07974 would be octal; §6.2.4.1)
};

Address 생성자는 다음과 같이 정의될 수 있다.

Address::Address(const string& n, int nu, const string& s, const string& t, const string& st, int z)
// validate postal code
	:name{n},
	number{nu},
	street{s},
	town{t}
{
	if (st.size()!=2)
		error("State abbreviation should be two characters")
	state = {st[0],st[1]}; // store postal code as characters
	ostringstream ost; // an output string stream; see §38.4.2
	ost << z; // extract characters from int
	string zi {ost.str()};
	switch (zi.siz e()) {
	case 5:
		zip = {zi[0], zi[1], zi[2], zi[3], zi[4]};
		break;
	case 4: // star ts with ’0’
		zip = {'0', zi[0], zi[1], zi[2], zi[3]};
		break;
	default:
		error("unexpected ZIP code format");
	}
	// ... check that the code makes sense ...
}
728x90
반응형

'Program Language > C & C++' 카테고리의 다른 글

[C++] 구조체 타입 동등성  (2) 2022.01.03
[C++] 구조체와 배열  (0) 2022.01.03
[C++] 구조체 이름  (0) 2022.01.03
[C++] 구조체 layout  (0) 2022.01.03
[C++] 구조체 (structure)  (0) 2021.12.29