类.

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 成员。