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 |