《C++ primer》第七章

1. 类如何调用其成员函数?

Sale_data是一个类,total是类的实体对象,Sale_data中有成员函数isbn。那么Sale_data在调用isbn成员时传入了total的地址。isbn函数有一个隐式参数this,我们调用isbn这个成员函数时,用请求该函数的对象地址初始化this。

2.类的作用域和成员函数:在类中,如果成员变量在成员函数之后定义,成员函数也是可以使用该成员变量的。因为编译器首先编译成员的声明,之后才编译函数体。

3.类外部定义的成员函数必须与类内部的函数声明相匹配。

4.引入const成员函数

如果一个函数只能够读取它所调用对象的数据成员,而不能够写入,则需要引入const成员函数。

如何把this设置为指向常量的指针?this是隐式的,不会出现在参数列表中。所以将this生命诚指向常量的指针的做法是允许把const关键字放在成员函数的参数列表之后,此时紧跟在参数列表之后的const表示this是一个指向常量的指针,不能改变调用它的对象的内容。

5.构造函数

类通过一个特殊的构造函数来默认初始化过程,叫默认构造函数。默认构造函数没有任何实参。编译器创建的构造函数又被称为合成的默认构造函数。某些类不能依赖于合成的默认构造函数。因为:默认构造函数只适合简单的类;调用默认构造函数可能执行错误;不能为某些类合成默认的构造函数。

如果我们需要默认行为,可以通过在参数列表上写上=default的方式。

6.访问权限控制

类可以在它的第一个访问说明符之前定义成员。这种访问权限依赖于定义类的方式。如果使用struct关键字,则定义第一个访问说明符之前的成员全都是public;如果定义的是class关键字,则这些成员是private。这是struct和public唯一的区别。

7.友元

类可以允许其他类或者函数访问其非公有成员。方法是令其它类或者函数成为它的友元。在函数前声明一个friend关键字就可以将函数声明成为友元。

友元声明只能出现在类定义的内部。一般来说最好是在类开始和结束的时候集中声明友元。

类可以把其他类定义成友元,可以把其他类的成员函数定义成友元。此外,友元函数能够定义在类内部。

基本逻辑是:A类如果允许B类访问自己的成员,那么在A类中应该将B设置成为友元。友元关系不存在传递性。

想要把重载函数声明成为友元,要对这一组重载函数中的每一个函数分别声明。

假设某类内部某友元函数被定义过,但未被声明过,此时类的成员函数是不能够调用该有友元函数的。

8.类类型

一旦一个类名字出现之后,就被认为是声明过了(但尚未定义)。因此类允许包含指向自己的指针。

9.名字查找与函数作用域

类型名的定义一般在函数最开始的地方,这样能够确保所有使用该类型名的成员都出现在定义之后。

10.构造函数的初始值列表

使用初始值列表初始化参数的效率更高,而使用赋值的方式效率会低很多。

11.构造函数的初始值有时必不可少

成员是const、引用或者其他没有提供默认构造函数的类类型的时候,必须通过初始值列表对其进行初始化。

一般来说,初始值列表的成员初始化顺序没什么关系。但是当要使用一个成员初始化另一个成员的时候,需要注意成员的定义顺序。成员的初始化顺序应该和声明顺序保持一致。

12.委托构造函数:在函数的参数列表中写出构造函数。也就是说将该构造函数的某一部分任务委托给另一个构造函数。

13. 默认构造函数:在实际中如果定义了其他构造函数,那么最好也提供一个默认构造函数。

14.隐式类类型转换:如果一个函数只定义了一个实参,那么它实际上定义了转换为此类类型的隐式转换机制。我们把这种构造函数成为转换构造函数。

类类型的转换只允许一步一步转换。

在要求隐式转换的程序的上下文中,我们可以通过explicit关键字加以阻止。关键字explicit只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换。所以无需将这些构造函数指定为explicit的。 explicit是只能在函数里面使用的关键字,函数体外定义时不能重复使用。

使用explicit关键字的构造函数只能用于直接初始化,不能用于赋值初始化。

尽管增加了explicit关键字的函数不能够用于隐式转换过程,但是我们可以将参数显式转换,之后使用该构造函数。比如:

item.combine(Sales_data(null_book));//null_book原本是一个string,Sales_data类中接受string 类
//型参数的构造函数前写了explicit关键字。combine是Sales_data类的一个函数,接受Sales_data类型参 
 //数。在这里我们将null_book强制类型转,然后使用combine函数。

或者使用static_cast<Sales_data>(null_book)的方式进行显式转换也是可以的。

explicit只是使得构造函数不支持隐式类型转换。

15.类的静态成员

直接与类本身相关而不是与某个对象保持关联,此时可以将该成员成名称为静态对象。

静态成员可以类内初始化,可以作为默认实参。

猜你喜欢

转载自blog.csdn.net/eriHanami/article/details/82708994