构造函数一般应使用一个构造函数初始化列表,来初始化对象的数据成员。
Sales_item(): units_sold(0), revenue(0.0) {};
在类内部定义的函数默认为inline.
将关键字const加在形参表之后,就可以将成员函数声明为常量:
double avg_price() const;
习题12.1:
using namespace std; class Person { private: string name; string address; }
习题12.2:
using namespace std;
class Person {
Persion(string &name, string &addr)
{
}
private:
string name;
string address;
};
习题12.3:
using namespace std;
class Person {
Persion(string &name, string &addr)
{
}
private:
string name;
string address;
public:
string getName() const
{
return self.name;
}
string getAddr() const
{
return self.address;
}
};
返回名字和地址的操作不应该修改成员变量的值,所以应该指定成员函数为const。
习题12.4:
name和address为private实现数据隐藏, 函数getName() 和getAddr()为public提供接口,构造函数通常也为public.
在C++中,使用访问标号(public, private, protected)来定义类的抽象接口和实施封装。
两个优点:
习题12.5:
C++支持三种访问标号,public private protected
习题12.6:
class关键字定义的类,默认的访问权限为private,struct关键字定义的类,默认的访问权限是public。
习题12.7:
封装是一种将低层次的元素组合起来形成新的,高层次实体的技术。
封装隐藏了内部元素的实现细节。
类可以定义自己的局部类型的名字。
class Screen { public: // interface member functions typedef std::string::size_type index; private: std::string contents; index cursor; index height, width; };
注意:inline成员函数的定义必须在调用该函数的每个源文件中是可见的,不在类体内定义的inline成员函数,其定义通常应放在有类定义的同一头文件中。
12.8:
class Sales_item { public: double avg_price() const; bool same_isbn(const Sales_item &rhs) const { return isbn == rhs.isbn; } private: std:string isbn; unsigned units_sold; double revenue; }; inline double Sales_item :: avg_price() const { if (units_sold) return revenue/units_sold; else return 0; }
其他的两种写法:
习题12.9:
class Screen { public: // interface member functions typedef std::string::size_type index; Screen(index ht, index wt, const std::string &cntnts) { height = ht; width = wt; contents = cntnts; } private: std::string contents; index cursor; index height, width; };