类.
Key Concept: Benefits of Data Abstraction and
Encapsulation
关键概念:数据抽象和封装的好处
Data abstraction and encapsulation provide two important advantages:
数据抽象和封装提供了两个重要优点:
Class internals are protected from inadvertent user-level errors,which might corrupt the state of the object.
避免类内部出现无意的、可能破坏对象状态的用户级错误。
The class implementation may evolve over time in response to changing requirements or bug reports without requiring change in user-level code.
随时间推移可以根据需求改变或缺陷(bug )报告来完美类实现,而无须改变用户级代码。
Mutable Data Members
可变数据成员
It sometimes (but not very often) happens that a class has a data member that we want to
be able to modify, even inside a const member function. We can indicate such members by
declaring them as mutable.
有时(但不是很经常),我们希望类的数据成员(甚至在 const
成员函数内)可以修改。这可以通过将它们声明为 mutable 来实现。
A mutable data member is a member that is never const, even when it is a member of a const object. Accordingly, a const member function may change a mutable member. To declare a data member as mutable, the keyword mutable must precede the declaration of the member:
可变数据成员(mutable data member)永远都不能为 const,甚至当它是 const 对象的成员时也如此。因此,const 成员函数可以改变 mutable
成员。要将数据成员声明为可变的,必须将关键字 mutable 放在成员声明之前:
例如:
class Screen
{
public:
// interface member functions
private:
mutable size_t access_ctr; // may change in a const members
// other data members as before
};
我们给 Screen 添加了一个新的可变数据成员 access_ctr。使用 access_ctr 来跟踪调用 Screen成员函数的频繁程度:
void Screen::do_display(std::ostream& os) const
{
++access_ctr; // keep count of calls to any member function
os << contents;
}
构造函数
从概念上讲,可以认为构造函数分两个阶段执行:(1)初始化阶段;(2
)普通的计算阶段。计算阶段由构造函数函数体中的所有语句组成。
有些情况下必须使用初始化列表
1.如果类成员对象没有默认的初始化函数
2.如果类成员对象不支持default assign operator=.
以上两种情况下需要使用初始化列表
记住,可以初始化 const
对象或引用类型的对象,但不能对它们赋值。在开始执行构造函数的函数体之前,要完成初始化。
必须对类成员中的引用或const成员使用成员初始化列表
按照与成员声明一致的次序编写构造函数初始化列表是个好主意。此外,尽可
能避免使用成员来初始化其他成员。
static成员
正如类可以定义共享的 static 数据成员一样,类也可以定义 static 成员函数。static 成员函数没有 this
形参,它可以直接访问所属类的 static 成员,但不能直接使用非 static 成员。