Archive for 2 5 月, 2010

C++ Primer Chapter12

星期日, 2 5 月, 2010

1、类定义了一个新的类型和一个新的作用域。

每个类可以没有成员,也可以定义多个成员,成员可以是数据、函数或类型别名

2、在类内部定义的函数默认为inline。像其他inline一样,inline成员函数的定义必须在调用该函数的每个源文件中是可见的。不在类定义体内定义的inline成员函数,其定义通常应放在有类定义的同一头文件中。

3、将关键字const加在形参列表之后,就可以将成员函数声明为常量:

double avg_price() const;

const成员不能改变其所操作的对象的数据成员。const必须同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译时错误。

4、一个访问标号(private、protected、public)可以出现的次数通常是没有限制的。每个访问标号指定了随后的成员定义的访问级别。这个指定的访问级别持续有效,直至遇到下一个访问标号或看到类定义体的右花括号为止。

5、除了定义数据和函数成员之外,类还可以定义自己的局部类型名字。

class Screen {

public:

    typedef std::string::size_type index;

private:

    index cursor;

};

6、在声明之后、定义之前,类类型是一个不完全类型,即已知是类类型,但不知道包含哪些成员。

不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。

7、不能从const成员函数返回指向类对象的普通引用(只能返回const引用)。const成员函数只能返回*this作为一个const引用。

基于成员函数是否为const,可以重载一个成员函数;同样地,基于一个指针形参是否指向const,可以重载一个函数。

8、类的数据成员声明为mutable即可在任何成员函数内(甚至在const成员函数内)进行修改。

可变数据成员永远都不能为const,甚至当它是const对象的成员时也如此。因此,const成员函数可以改变mutable成员。要将数据成员声明为可变的,必须将关键字mutable放在成员声明之前:mutable size_t access_ctr;

9、完全限定名之后的类成员函数定义、形参表和函数体都处于类作用域中。

在定义于类外部的成员函数中,形参表和成员函数体都出现在成员名之后。这些都是在类作用域中定义,所以可以不用限定而引用其他成员。

与形参类型相比,返回类型出现在成员名字前面。如果函数在类定义体之外定义,则用于返回类型的名字在类作用域之外。如果返回类型使用由类定义的类型,则必须使用完全限定名。

10、构造函数初始化式只在构造函数的定义中而不是声明中指定。不管成员是否在构造函数初始化列表中显示初始化,类类型的数据成员总是在初始化阶段初始化。初始化发生在计算阶段开始之前。

有些成员必须在构造函数初始化列表中进行初始化。对于这样的成员,在构造函数体中对它们赋值不起作用。没有默认构造函数的类类型的成员,以及const或引用类型的成员,不管是哪种类型,都必须在构造函数初始化列表中进行初始化。

记住,可以初始化const对象或引用类型的对象,但不能对它们赋值。初始化const或引用类型数据成员的唯一机会是在构造函数初始化列表中。

必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式。

11、构造函数初始化列表仅指定用于初始化成员的值,并不指定这些初始化执行的次序。成员被初始化的次序就是定义成员的次序。第一个成员首先被初始化,然后是第二个,依次类推。

12、可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。

通常,除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为explicit。将构造函数设置为explicit可以避免错误,并且当转换有用时,用户可以显式地构造对象。explicit关键字只能用于类内部的构造函数声明上。

13、友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响。

友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。将一个类设为友元,友元类的所有成员函数都可以访问授予友元关系的那个类的非公有成员。

友元类,必须先定义该类。友元函数,必须先定义授予友元关系的类。

14、因为static成员不是任何对象的组成部分,所以static成员函数不能被声明为const。毕竟,将成员函数声明为const就是承诺不会修改该函数所属的对象。最后,static成员函数也不能被声明为虚函数。

static数据成员必须在类定义体的外部定义(正好一次)。

不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。

保证对象正好定义一次的最好办法,就是将static数据成员的定义放在包含类的非内联成员函数定义的文件中。

const static数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体在外进行定义。在类内部提供初始化式时,成员的定义不必再指定初始值。

static数据成员的类型可以是该成员所属的类类型。

C++ Primer Chapter11

星期日, 2 5 月, 2010

占位符。