【c++ primer 笔记】第七章 类

来源:互联网 发布:ug五轴编程工资多少钱 编辑:程序博客网 时间:2024/06/04 17:59

1.

定义在类内部的函数是隐式地inline函数

this指针是一个常量指针,不允许改变this中保存的地址


常成员函数

string isbn() const {return this->bookNo;}

此const给this指针加了一个底层const,使得this指向的内容无法改变

默认情况下,我们不能把this绑定到一个常量对象上,也就是说我们不能在一个常量对象上调用非常量函数,因此常量对象只能调用常量函数


构造函数

构造函数在const对象的构造过程中可以向其写值(初始化列表)

只有当类没有声明任何构造函数时,编译器才会自动的生成默认构造函数。

利用 =default 产生默认构造函数

Sales_data() = default;

当某个数据成员被构造函数初始值列表忽略时,它将以与合成默认构造函数相同的方式隐式初始化。

通常情况下,构造函数使用类内初始值是一种较好的选择


2.

struct与class定义类唯一的区别是默认访问权限不同。如果使用struct,则定义在第一个访问说明符之前的成员是public的;如果使用class关键字,则这些成员是private的


友元

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

友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明

如果一个类指定了友元类,则友元类的成员函数可以访问此类包括非公有成员在内的所有成员

友元关系不存在传递性


3.

可变数据成员

通过在变量的声明中加入mutable关键字可以使得他即使是在const成员函数内也可以被改变

一个可变数据成员永远不会是const,即使他是const对象的成员


4.

编译器处理完类中的全部声明后才会处理成员函数的定义,而类型名的定义需要出现在使用之前。因此类型名的定义通常出现在类的开始处。

在类中,如果成员使用了外层作用域中的名字,而该名字代表一种类型,则不能在之后重新定义该名字


5.

初始值列表

对成员变量进行初始化(不同于赋值),对于const或是引用的成员,必须对其进行初始化。当成员属于某种类类型且该类没有定义默认构造函数时,也必须对这个成员初始化。

利用初始值列表初始化成员的顺序与成员在类定义中出现的顺序一致,与在初始值列表中出现的顺序无关。


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


委托构造函数,如下形式

Sales_data(string s , unsigned cnt, double price) : bookNo(s), units_sold(cnt), revenue(cnt*price) {}Sales_data(): Sales_data("", 0, 0)  {}

当一个构造函数委托给另一个构造函数时,受委托的构造函数的初始值列表和函数体被依次执行,然后控制权才会交给委托者函数体。


隐式类类型转换

如果构造函数只接受一个参数,则它实际上定义了转换为此类类型的隐式转换机制

string null_book = "9-999-99999-9";item.combine(null_book);


combine原本接受一个Sales_data类型的参数,而Sales_data有只含一个string类型的参数的构造函数,所以这里string类型的null_book可隐式转换为Sales_data类型

我们可以将构造函数声明为explicit阻止这种隐式转换

explicit只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换,所以无需将这些构造函数指定为explicit的。

只能在类内证明构造函数时使用explicit关键字,在类外定义时不应出现

explicit会阻止隐式转换,但不会阻止显示转换


聚合类

所有成员都是public;没有定义任何构造函数;没有类内初始值;没有基类,也没有虚函数

可以提供一个花括号括起来的成员初始值列表

struct Data{    int ival;    string s;};Data val = {0,"Anna"};


6.
类的静态成员

类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。

类似的,静态成员函数也不与任何对象绑定在一起,它们不包含this指针。作为结果,静态成员函数不能声明称const的,而且我们也不能在static函数体内使用this指针。

与explicit相同,当在类的外部定义静态成员时,不能重复static关键字,该关键字只出现在类内部的声明语句

通常情况下,类的静态成员不应该在类的内部初始化

静态数据成员可以是不完全类型(只声明未定义)。特别的,静态数据成员的类型可以就是它所属的类类型

0 0