c++ primer 5th 笔记:第七章

第七章

  笔记

    1. 定义在类内部的函数是隐式的inline函数。

    2. 使用const的成员函数被称作常量成员函数(const member function)。

    3. 首先编译成员的声明,然后才轮到成员函数体。因此,成员函数体可以随意使用类中的其他成员而无须在意这些成员出现的次序。

    4. IO类属于不能被拷贝的类型,因此只能通过引用来传递它们。

    5. 每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程。这些函数叫做构造函数

    6. 默认构造函数无须任何实参。如果我们的类没有显示定义任何构造函数,那么编译器就会为我们隐式地定义一个默认函数,被称作合成的默认构造函数。合成的默认构造函数只适合非常简单的类。

    7. 在c++11新标准中,如果我们需要合成默认构造函数的行为,那么可以通过在参数列表后面写上=default来要求编译器生成构造函数。如果=default在类的内部,则默认构造函数是内联的;如果它在类的外部,则该成员默认情况下不是内联的。

    8. 类还需要控制拷贝、赋值和销毁对象时发生的行为。如果我们不主动定义这些操作,则编译器将替我们合成它们。

    9. 类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友员(friend)

    10. 一个可变数据成员(mutable data member)永远不会是const,即是它是const对象的成员。

    11. 仅声明类而暂时不定义它,这种声明被称作前向声明(forward declaraion),在它声明之后定义之前是一个不完全类型

    12. 当一个名字第一次出现在一个友元声明中时,我们隐式地假定该名字在当前作用域中时可见的(即在声明前就使用这个名字)。

    13. 随着构造函数一开始执行,初始化就完成了。因此,我们初始化const或者引用类型的数据成员唯一的机会就是通过构造函数初始值。 成员的初始化顺序与他们在类定义中的出现顺序一致。

    14. 如果一个构造函数为所有参数都提供了默认参数,则它实际上也定义了默认构造函数。

    15. c++新标准扩展了构造函数初始值的的功能,使得我们可以定义所谓的委托构造函数

    class Sales_data
    {
    pulic:
        // 非委托构造函数使用对应的实参初始化成员
        Sales_data(std::string s, unsigned cnt, double price):
                            bookNo(s), units_sold(cnt), revenue(cnt*price)  {  }
        // 其余构造函数全部委托给另一个构造函数
        Sales_data() : Sales_data("", 0, 0)   { }
        Sales_data(std::string s) : Sales_data(s, 0, 0)    { }
        Sales_data(std::istream &is) : Sales_data()
                                      {  read(is, *this);   }
        // 其他成员与之前的版本一样
    };
        // 执行顺序:当这些委托的构造函数执行完后,接着执行istream&构造函数体的内容。
        // 当一个构造函数委托给另一个构造函数时,受委托的构函数的初始值列表和函数体被
        // 依次执行。

    16. 我们通过在成员的声明之前加上关键字static使得其与类关联在一起。静态成员函数不与任何对象绑定在一起,它们不包含this指针。我们可以使用作用域运算符符直接访问静态成员(Account::rate()),也可以使用类的对象来访问静态成员。

    17. 我们不能在类的内部初始化静态成员。相反,必须在类的外部定义和初始化每个静态成员

  重点知识点总结

    聚合类和字面值常量类(待补充)。

    隐式的类类型转换

      C++语言在内置类型之间定义了几种自动转换规则。同样,我们也能为类定义隐式转换规则。如果构造函数只接受一个实参,则它实际上定义了 转换为此类类型的隐式转换机制,有时我们把这种构造函数称作为转换构造函数(converting constructor)。

      string null_book = "9-999-99999-9";
      // 构造一个临时的Sales_data对象
      // 该对象的units_sold和revenue等于0,bookNo等于null_book
      item.combine(null_book);
      // 因为combine的参数是一个常量引用,所以我们可以给该参数传递一个临时量

      只允许一步类类型转换。

      // 错误:需要用户定义的两种转换
      // (1) 把"9-999-99999-9"转换成string
      // (2) 再把这个(临时的)string转换成Sales_data
      item.combine("9-999-99999-9");   // 错误

      抑制构造函数定义的隐式转换。我们可以通过将构造函数声明为explicit加以阻止。而且,explicit关键字只允许出现在类内的构造函数声明处。

      class Sales_data
      {
       public:
              Sales_data() = default;
              Sales_data(const std::string &s, unsigned n, double p) :
                                  bookNo(s), units_sold(n), revenue(p*n)  {   }
              explicit Sales_data(const std::string &s) : bookNo(s)    {   }
              explicit Sales_data(std::istream&);
      };

      item.combine(null_book);  // 错误:string构造函数是explicit的
      item.combine(cin);     // 错误:istream构造函数是explicit的

      显式强制进行转换

      item.combine(static_cast<Sales_data>(cin));
        // 正确:static_cast可以使用explicit的构造函数

  术语

    数据抽象(data abstraction)、封装(encapsulation)、抽象数据类型(abstract data type)、成员函数(member function)、访问说明符(access specifiers)、构造函数初始值列表(constructor initializer list)、显示构造函数(explicit constructor)、友元(friend)、合成默认构造函数(synthesized default constructor)。

    构造函数初始值列表:说明一个类的数据成员的初始值,在构造函数体执行之前首先用初始值列表中的值初始化数据成员。未经初始化的成员将被默认初始化。

    显式构造函数:可以使用一个单独的实参调用但是不能用于隐式转换的构造函数。

                                                2016-10-30 15:37:31

时间: 2024-10-17 23:10:12

c++ primer 5th 笔记:第七章的相关文章

c++ primer 5th 笔记:第九章

第九章:顺序容器 笔记 1. 一个容器就是一些特定类型对象的集合.顺序容器(sequential container)为程序员提供了控制元素存储和访问顺序的能力. 2. 容器分为有序容器和无序容器:访问分为顺序访问和随机访问. 3. forward_list和array是新C++标准增加的类型.与内置数组相比,array是一种更安全.更容易使用的数组类型.与内置数组类似,array对象的大小是固定的. 4. 通常,使用vector是最好的选择,除非你有很好的理由选择其他容器. 5. 容器操作中类

C++PRIMER 阅读笔记 第三章

本章主要介绍 string vector 和 bitset, 不能贪多,现在本文主要介绍 string 与 vector 头文件中最好不要使用namespace std, 因为头文件会直接被预处理器放置到C中 std::string 的构造方式: string s1; string s2(s1); string s3("value");string s4(n,'c');           第三种构造方式可有"\0"? cout 与 cin 可以直接操作string

Android群英传笔记——第七章:Android动画机制和使用技巧

Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中十分重要的一部分,从早期的Android版本中,由于动画机制和绘图机制的不健全,Android的人机交互备受诟病,Android从4.X开始,特别是5.X,动画越来越完善了,Google也开始重视这一方面了,我们本章学习的主要内容有 Android视图动画' Android属性动画 Android动画

C primer plus 练习题 第七章

1. 1 #include <stdio.h> 2 3 #define SPACE ' ' 4 #define NEWLINE '\n' 5 6 int main() 7 { 8 int spaces,newlines,others; 9 char ch; 10 spaces = newlines = others = 0; 11 while((ch=getchar())!= '#') 12 { 13 /* 14 if(ch == SPACE) 15 { 16 spaces++; 17 }el

In-memory Computing with SAP HANA读书笔记 - 第七章:Business continuity and resiliency for SAP HANA

本文为In-memory Computing with SAP HANA on Lenovo X6 Systems第七章Business continuity and resiliency for SAP HANA的读书笔记. Overview of business continuity options 业务连续性有不同的级别,采用何种级别取决于需求 Developing a business continuity plan highly depends on the type of busi

《深入理解计算机系统》读书笔记 第七章 链接

第七章链接 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储并执行. 链接的时机 编译时,也就是在源代码被翻译成机器代码时 加载时,也就是在程序被加载器加载到存储器并执行时. 运行时,由应用程序执行. 在现代系统中,链接是由链接器自动执行的. 链接器的关键角色:使分离编译称为可能. 7.1 编译器驱动程序 驱动程序的工作:1.运行C预处理器,将C源程序(.c)翻译成一个ASCⅡ码中间文件(.i):2.运行C编译器,将.i文件翻译

《深入理解计算机系统》读书笔记第七章——链接

<深入理解计算机系统>第七章 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行. 链接的时机 编译时,也就是在源代码被翻译成机器代码时 加载时,也就是在程序被加载器加载到存储器并执行时. 运行时,由应用程序执行. 在现代系统中,链接是由链接器自动执行的. 7.1 编译器驱动程序 编译系统提供编译驱动程序——调用语言预处理器.编译器.汇编器和链接器. (1)运行C预处理器:源程序main.c->ASCII码中间文件main.i (2)

《从0到1》笔记 第七章 向钱看

第七章 向钱看----风险投资中的幂次法则,在公司的经营也同样有效 风险投资家的任务是鉴定那些刚起步的前景光明的公司,投资这些公司并从中获利.风投中一种错误的投资组合是:期待所投的企业的回报呈正太分布.也就是说,没有希望的公司会倒闭,这样的企业不多:中等公司会一直持平,这样的企业最多:好的公司的回报会达到两倍甚至四倍,但这们的企业也不多,却弥补了倒闭企业的亏损. 但是这种“撒网式投资,然后祈祷”是会全盘皆输的.这是因为风险投资的回报并不遵行正态分布,是是遵循幂次法则:一小部分公司的回报完胜其他所

Java学习笔记—第七章 类的深入解析

第七章 类的深入解析 1. 继承 1.1 类继承的方法:在Java中,子类对父类的继承是在类的声明中使用extends关键字来指明的.其一    般格式为:[类修饰符] class <子类名> extends <父类名>{ 类体内容 }.一个类只能直接继承一个    父类,一个父类可以有多个子类. 1.2 成员变量的继承和隐藏:基于父类创建子类时,子类可以继承父类的成员变量和成员方法.但是,     如果在父类和子类中同时声明了一个同名变量,则这两个变量在程序运行时同时存在.即:父