zoukankan      html  css  js  c++  java
  • C++ primer plus读书笔记——第10章 对象和类

    第10章 对象和类

    1. 基本类型完成了三项工作:

      决定数据对象需要的内存数量;

      决定如何解释内存中的位;

      决定可使用数据对象执行的操作或方法。

    2. 不必在类声明中使用关键字private,因为这是类对象的默认访问控制机制。

    3. 其定义位于类声明中的函数都将自动成为内联函数。

    4. 如果愿意,也可以在类声明之外定义成员函数,并使其称为内联函数。为此,只需要在类实现部分定义函数时使用inline限定符即可。

    5. 内联函数的特殊规则要求在每个使用它们的文件中都对其进行定义。确保内联定义对多文件程序中的所有文件都可用的、最简便的方法是:将内联定义放在定义类的头文件中。(内联函数应该放在头文件中)

    6. 设置显示的小数位数和恢复:

      std::streamsize prec = std::cout.precision(3);//显示3位小数

      …

      std::cout.precision(prec);

    设置定点表示,避免使用科学计数法:

    using std::ios_base;

    ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield);

    cout.setf(orig, ios_base::floatfield);

    7. 构造函数没有返回值,但没有被声明为void类型。

      构造函数参数名不能与类成员相同。

    8. 隐式调用构造函数:

      Stock food(“World Cabbage”, 250, 1.25);

      显式调用构造函数:

      Stock food = Stock(“World Cabbage”, 250, 1.25);

      和new一起使用:

      Stock *pstock = new Stock(“World Cabbage”, 250, 1.25);

    9. 默认构造函数

      当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,程序员就必须提供默认构造函数了。否则,下面的定义将出错:

    Stock stock1;

    定义默认构造函数的方式有两种。一种是给已有构造函数的所有参数提供默认值。另一种是通过函数重载来定义一个没有参数的构造函数。

    10. 调用默认构造函数的方式:

      Stock first;

      Stock first = Stock();

      Stock *pstock = new Stock;

    然而,不要被非默认构造函数的隐式形式所误导:

    Stock second();

    second是一个返回Stock对象的函数。隐式地调用默认构造函数时,不要加圆括号。

    11. 析构函数的名称很特殊:在类名前加上~。析构函数没有返回值和参数。

    12. 由于自动变量被放在栈中,因此最后创建的对象最先被删除,最先创建的对象最后被删除。

    13. 下面两条语句有根本性的差别。

      Stock stock2 = Stock(“Boffo Object”, 2, 2.0);//初始化,可能会创建一个临时对象。

      Stock stock1;

      stock1 = Stock(“Boffo Object”, 2, 2.0);//赋值,一定会创建一个临时对象。

    14. const Stock land = Stock(“Boffo Object”, 2, 2.0);

      land.show();//这一行如果show()不是const成员函数,将出错。

    由于该方法所使用的对象是隐式地提供的,没办法使用const引用或指向const的指针来解决问题。为了让函数保证不会修改调用对象,C++的解决方法是将const关键字放在函数的括号后面。也就是说,show()的声明应像这样:

    void show() const;

    同样,函数定义的开头应像这样:

    void Stock::show() const{…};

    15. 如果编译器支持C++11,则可使用列表初始化:

      Bozo bozetta = {“Bozetta”, “Biggens”};

      Bozo bozetta{“Bozetta”, “Biggens”};

      Bozo *pc = new Bozo{“Bozetta”, “Biggens”};

    16. 接受一个参数的构造函数允许使用赋值语法将对象初始化为一个值:

    Classname object = value;

    这种特性可能导致问题,正如第11章将介绍的,可关闭这项特性。

    17. this指针指向用来调用成员函数的对象(this被作为隐藏参数传递给方法)。在函数的括号后面使用const限定符将this限定为const,这样不能使用this来修改对象的值。

    18. C++在创建对象前,并没有用于存储值的空间,因此如下定义是行不通的:

    class Bakery

    {

       private:

    const int Months = 12;

    double costs[Months];

       有两种方式可以实现这个目标。

       第一种方式使用枚举:

       class Bakery

       {

          private:

            enum {Months = 12};

            double costs[Months];

              …

       用这种方式声明枚举并不会创建类数据成员,所有对象中都不包含枚举。Months只是一个符号名称。

       由于这里使用枚举只是为了创建符号常量,并不打算创建枚举类型的变量,因此不需要提供枚举名。这种方法很常用,诸如ios_base::fixed就是ios_base类中定义的典型的枚举量。

       第二种方式是使用static关键字:

       class Bakery

       {

          private:

            static const int Months = 12;

            double cost[Months];

            …

       该静态常量将和其它的静态变量存储在一起,而不是存储在对象中。因此,只有一个Months常量,被所有Bakery对象共享。

    19. 作用域内枚举(C++11)

    传统的枚举存在一些问题,其中之一就是两个枚举定义的枚举量可能发生冲突。为避免这种问题,C++11提供了一种新枚举,其枚举量的作用域为类。

    enum egg {Small, Medium, Large, Jumbo};

    enum t_shirt {Small, Medium, Large, Xlarge};

    这将无法通过编译,因为egg Small和t_shirt Small位于相同的作用域内,它们将发生冲突。为了避免这种问题,C++11提供了一种新枚举,其枚举量的作用域为类。如下:

    enum class egg{ Small, Medium, Large, Jumbo };

    enum class t_shirt{Small, Medium, Large, Xlarge};

    也可以使用关键字struct代替class,但无论使用哪种方式,都需要使用枚举名来限制枚举量:

    egg choice = egg::Large;

    t_shirt Floyd = t_shirt::Large;

    该注意的是,作用域内枚举不能隐式地转换为整形,在必要时,可以进行显式类型转换。普通枚举的底层整形类型表示取决于实现。对于作用域内枚举,C++11规定它的底层类型为int。还提供了一种语法,可用于做出不同的选择:

       enum class : short pizza {Small, Medium, Large, XLarge};

       在C++11中,也可以使用这种语法指定常规枚举的底层类型,但如果没有指定,编译器选择的底层类型随实现而异。

    20. 类很适用于描述ADT。公有成员函数借口提供了ADT描述的服务,类的私有部分和类方法的代码提供了实现,这些实现对类的客户隐藏。

  • 相关阅读:
    接口自动化平台
    MAC安装社区版本IDEA
    Python比较图片的不同
    快看!markdown的语法原来如此简单~
    说一说你不了解的Tailwind CSS响应式设计~
    Tailwind CSS安装和构建的正确操作方式
    一款绝对让你惊艳的CSS框架——TailwindCSS
    备受争议的PHP前景究竟如何?我们该何去何从?
    laravel8更新之速率限制改进
    laravel8更新之维护模式改进
  • 原文地址:https://www.cnblogs.com/lakeone/p/5106547.html
Copyright © 2011-2022 走看看