C++ Primer4 Chapter 12. Classes

来源:互联网 发布:php全套网站模板 编辑:程序博客网 时间:2024/06/01 08:17

12.1类的定义和声明

     1,成员函数 

         1)在类内部,声明成员函数是必需的,而定义成员函数则是可选的。在类内部定义的函数默认为 inline。

         2)类的成员函数将关键字 const 加在形参表之后,就可以将成员函数声明为常量。const 成员不能改变其所操作的对象的数据成员。const 必须同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译时错误。

     2,显式指定inline函数

          可以在类定义体内部指定一个成员为inline,作为其声明的一部分。或者,也可以在类定义外部的函数定义上指定 inline。在声明和定义处指定 inline 都是合法的。在类的外部定义 inline 的一个好处是可以使得类比较容易阅读。

 

12.2隐含的指针

      1,何时使用指针

           尽管在成员函数内部显式引用 this 通常是不必要的,但有一种情况下必须这样做:当我们需要将一个对象作为整体引用而不是引用对象的一个成员时。最常见的情况是在这样的函数中使用 this:该函数返回对调用该函数的对象的引用。
       2,从 const 成员函数返回 *this
           在普通的非 const 成员函数中,this 的类型是一个指向类类型的 const 指针(第 4.2.5 节)。可以改变 this 所指向的值,但不能改变 this 所保存的地址。在 const 成员函数中,this 的类型是一个指向 const 类类型对象的 const 指针。既不能改变 this 所指向的对象,也不能改变 this 所保存的地址。

 

12.4构造函数

      1,构造函数自动执行

           只要创建该类型的一个对象,编译器就运行一个构造函数:

               // constructor that takes a string used to create and initialize variable
              Sales_item Primer_2nd_ed("0-201-54848-8");
             // default constructor used to initialize unnamed object on the heap
            Sales_item *p = new Sales_item();

           第一种情况下,运行接受一个 string 实参的构造函数,来初始化变量 Primer_2nd_ed。第二种情况下,动态分配一个新的 Sales_item 对象。假定分配成功,则通过运行默认构造函数初始化该对象。

 

12.4.1, 构造函数初始化式
     1,  与任何其他函数一样,构造函数具有名字、形参表和函数体。与其他函数不同的是,构造函数也可以包含一个构造函数初始化列表:
                  // recommended way to write constructors using a constructor initializer
                Sales_item::Sales_item(const string &book):
                  isbn(book), units_sold(0), revenue(0.0) { }

       构造函数初始化列表以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个数据成员后面跟一个放在圆括号中的初始化式。这个构造函数将 isbn 成员初始化为 book 形参的值,将 units_sold 和 revenue 初始化为 0。与任意的成员函数一样,构造函数可以定义在类的内部或外部。构造函数初始化只在构造函数的定义中而不是声明中指定。
     2,   如果没有为类成员提供初始化式,则编译器会隐式地使用成员类型的默认构造函数。如果那个类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。在这种情况下,为了初始化数据成员,必须提供初始化式。

     3,  一个初始化式可以是任意复杂的表达式。例如,可以给 Sales_item 类一个新的构造函数,该构造函数接受一个 string 表示 isbn,一个 usigned 表示售出书的数目,一个 double 表示每本书的售出价格:
             Sales_item(const std::string &book, int cnt, double price):
              isbn(book), units_sold(cnt), revenue(cnt * price) { }
12.5, 友緣

     友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字 friend 开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方。通常,将友元声明成组地放在类定义的开始或结尾是个好主意。

 

12.6 static类成员