您的位置:首页 > 编程语言 > C语言/C++

读《C++ Primer 第四版》再温C++ —— Chapter 12 类

2014-07-28 17:09 309 查看
类内部定义的函数默认为inline。
显式定义inline函数时,在声明和定义指定inline都是合法的。

数据抽象: 一种依赖于接口和实现分离的编程(和设计)技术。
封装:将低层次的元素组合起来形成新的、高层次的实体的技术。函数是封装的一种形式。
并非所有的类型都必须是抽象的。标准库中的pair类就是一个实用的,设计良好的具体类而不是抽象类。具体类会暴露而非隐藏其实现细节。

应用程序为最终使用它的用户而设计,类的设计者为类的”用户“(程序员)设计并实现类。
即使类的使用者和设计者是同一个人,保持角色区分也是有益的:设计类的接口时,设计者应该考虑的是如何方便类的使用;使用类的时候,设计者就不应该考虑类如何工作。

class Screen; //声明类Screen
这个声明有时称为前向声明,在声明之后,定义之前,类Screen是一个不完全类型(incomplete type)。
不完全类型只能用于定义指向该类型的指针和引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的参数。
不完全类型不能定义该类型的对象。

可变数据成员mutable
可变数据成员永远不能为const,甚至当它是const对象的成员时也是如此。因此,const成员函数可以改变mutable成员。
要将数据成员声明为可变的,必须将关键字mutable放在成员声明之前:
class Screen {
public:
private:
    mutable size_t acess_ctr;           //may change in a const members
};

构造函数分两个阶段执行:(1)初始化阶段;(2)普通的计算阶段。 计算阶段由构造函数体内的所有语句组成。
不管成员是否在构造函数初始化列表中显示初始化,类类型数据成员总是在初始化阶段初始化。初始化阶段发生在计算阶段开始之前。

类数据成员为const对象或引用类型的对象,必须在初始化列表中初始化,不能在计算阶段对他们进行赋值。

类数据成员被初始化的次序就是定义成员的顺序。

类通常应该定义一个默认构造函数。通常在默认构造函数中给成员提供的初始值应该指出该对象为空。
如果没有默认构造函数,则该类就不能应用在以下环境中:
假如有一个NoDefault类,它没有定义自己的默认构造函数,只有一个接受一个string参数的构造函数。因此,编译器不再合成默认构造函数,NoDefault也就没有默认构造函数,那意味着
1)具有NoDefault成员的每个类的构造函数,必须通过传递一个初始的string值给NoDefault构造函数来显示的初始化NoDefault成员。
2)编译器不会为具有NoDefault类型成员的类合成默认构造函数。如果这样的类希望提供默认构造函数,则必须显示的定义,并在默认构造函数中显示的初始化NoDefault成员。
3)NoDefault类型不能用作动态分配数组的元素类型。
4)NoDefault类型的静态分配数组必须为每一个元素提供一个显示的初始化式。
5)如果有个保存NoDefault对象的容器,类如vector,就不能使用接受容器大小而没有同时提供一个元素初始化式的构造函数。

隐式类型转换
可以用单个实参来调用的构造函数定义了从形参(该单个实参的构造函数的形参)类型到该类类型的一个隐式转换。
通过将构造函数声明称explicit,可以抑制有构造函数定义的隐式转换。

static函数没有this指针
static数据成员必须啊在类定义体的外部定义,整型const static数据成员是一个特殊,可以在类定义体内初始化。
static数据成员不能访问非static数据成员。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: