public 멤버 함수).private).Sales_data 기본 인터페이스std::string isbn() const; ▶ 책 ID 반환 (읽기 전용)Sales_data& combine(const Sales_data& rhs); ▶ 합치기(자기 자신 갱신)double avg_price() const;friend로 선언)
Sales_data add(const Sales_data&, const Sales_data&);std::istream& read(std::istream&, Sales_data&);std::ostream& print(std::ostream&, const Sales_data&);클래스 안에서 정의된 함수는 자동으로 inline.
멤버 함수는 선언 위치와 무관하게 서로를 사용 가능
(클래스 본문 전체가 먼저 파싱되고 나서 함수 본체가 컴파일됨).
struct Sales_data {
// 공개 인터페이스
std::string isbn() const { return bookNo; } // inline + const 멤버
Sales_data& combine(const Sales_data& rhs) {
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this; // this 반환으로 체이닝
}
double avg_price() const {
return units_sold ? revenue / units_sold : 0;
}
// 데이터
std::string bookNo;
unsigned units_sold = 0; // in-class initializer(C++11)
double revenue = 0.0; // in-class initializer(C++11)
};
// 논멤버(보통 friend)
std::istream& read(std::istream& is, Sales_data& item) {
double price = 0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = item.units_sold * price;
return is;
}
std::ostream& print(std::ostream& os, const Sales_data& item) {
os << item.isbn() << " " << item.units_sold << " " << item.avg_price();
return os;
}
Sales_data add(const Sales_data& lhs, const Sales_data& rhs) {
Sales_data sum = lhs; // 복사
sum.combine(rhs);
return sum; // RVO
}
암기: “클래스 내부는 선언만 맞으면 순서 무관, 함수 본체는 나중에 컴파일.”
this와 const 멤버 함수멤버 호출은 내부적으로 this가 암시적으로 전달됨.
total.isbn() → Sales_data::isbn(&total)const 멤버 함수에서 this 타입은 Sales_data* const가 아니라 const Sales_data* const
따라서 멤버 수정 불가.
std::string isbn() const { return this->bookNo; } // this는 const 포인터