第7章 类

struct和class都是类,在一个项目中,将所有的class替换成struct,依旧可以正常运行。其最本质的区别就是,struct默认访问控制是public,class默认访问控制是private。还有一点区别就是:"class"这个关键字还用于定义模板参数,就像"typename",但关键字"struct"不用于定义模板参数。

通常情况下,struct应该被看成是一个数据结构的实现体,class应该被看成一个对象的实现体。

7.1.2

this

this是成员函数额外的隐式参数,其类型是CType *const this,是一个常量指针,不允许改变this中保存的地址。

const

string isbn() const {return bookNo;};    //常量成员函数

在此处const的作用是修改隐式this指针的类型。使之便为const CType *const this,从向量指针,设置成指向常量的常量指针。这样的成员函数叫做常量成员函数。

常量成员函数不能改变调用它的对象的内容。

7.1.4 构造函数

构造函数不能声明成const的。

如果没有显式定义构造函数,编译器就会隐式定义一个默认构造函数,又被称为合成的默认构造函数。默认构造函数将按照如下规则初始化类的数据成员:

  1. 如果存在类内的初试值(struct中可以指明初始值),则初始化。
  2. 否则,默认初始化成员。

一旦定义了其他的构造函数,编译器将不生成默认构造函数。除非再定义个默认构造函数。

对于有些数据成员,比如数组指针,默认初始化之后将是未定义的值。没有提供默认构造函数类内成员,将无法执行默认初始化。

自定义默认构造函数:

ClassType() = default;

构造函数初始值列表:

ClassType(int p1, int p2):a1(p1),a2(p2) {}

warming

有些编译器不支持雷内成员的初值,这样只能在构造函数中给初始化。

 

7.2.1

友元(friend)

类可以允许其他类或者函数访问他的非公有成员,方法是令其他类或者函数成为它的友元。

令外部函数作为友元,直接在类内部声明函数,前置friend

令其他类作为友元,在此类内:friend class ClassType

令成员函数作为友元,在此类内:friend class ClassType::Function()

7.3

令成员作为内联函数

定义在类内部的成员函数默认是inline的,外部需要显式指出

 

重载成员函数

 

可变数据成员

变量声明前加入mutable关键字,这样即使在const函数中,也可以修改此成员变量。

7.5.2 委托构造函数

class CType
{
public:
    CType(string s){};
    //委托构造函数
    CType():CType("asdf"){};
};

7.5.4 隐式类类型转换

若构造函数只接受一个实参,则它定义了这个实参类型向这个类类型转换的隐式转换机制。这种构造函数叫做转换构造函数。

为了抑制这种转换,可以在构造函数前声明为:explicit

7.5.5 聚合类

  1. 所有成员public
  2. 没有构造函数
  3. 没有类内初始值
  4. 没有积累,没有virtual函数

这样就可以提供一个花括号初始值列表,初始化聚合类的数据成员。

Data val1 = {0, "adsf"};

 

posted on 2015-05-06 21:07  峰入云  阅读(107)  评论(0编辑  收藏  举报

导航