第十二章:类

来源:互联网 发布:怎么变得成熟稳重 知乎 编辑:程序博客网 时间:2024/05/16 04:40

1.       在类内部定义的函数默认为inline,另外将const加在形参表之后,此时的函数不能改变其所操作的对象的数据成员.并且在声明和定义处都要加上const.

2.       成员的默认访问属性取决于类是通过何种方式定义的,struct定义的类其成员都是公共的,Class定义的类其成员默认是私有的

3.       数据抽象和封装提供了两个重要优点:

◆避免类内部出现无意的,可能破坏对象状态的用户级错误

◆随时间推移可以根据需要改变或缺陷报告来完善类实现,而无须改变用户级代码

         改变头文件中的类定义可有效改变包含该头文件的每个源文件的程序文本,因此,当类发生改变时,使用该类的代码必须重新编译.

4.       像其他inline一样,inline成员函数的定义必须在调用该函数的每一个源文件中是可见的.不在类定义体内定义的inline成员函数,其定义通常应放在有类定义的同一头文件中.

5.       定义对象时,将为其分配存储空间,(一般而言)定义类型时不进行存储分配.

6.       在普通的非const成员函数中,this的类型是一个指向类类型的const指针,可以改变this所指向的值,但是不能改变this所保存的地址,不能从const成员函数返回指向类对象的普通引用.const成员函数只能返回*this作为一个const引用.

7.       有时我们希望类的数据成员(甚至在const成员函数内)可以修改.这可以通过将他们声明为mutable成员,必须在成员声明之前使用.

8.       可以使用类型别名来简化类(例如typedef std::string::size_type index;是使用index来表示std::string::size_type这种类型.在其类外部定义的形参中如果用到index可以不必限定(即不需使用Class::index来表示),但如果是返回值时,则必须要加限定(即使用Class::index)

9.        类定义实际上是在两个阶段中处理

1).首先编译成员声明

2).只有在所有成员出现之后才编译他们的定义本身

10.使用全局变量可以使用::来约定.(MFC,当使用全局的函数,要用::来做约定)

11.如果没有为类成员提供初始化式,则编译器会隐式地使用成员类型的默认构造函数.如果那个类没有默认的构造函数,则编译器尝试使用默认构造函数将会失败.

         可以初始化const对象或引用类型的对象,但不能对它们赋值.在开始执行构造函数的函数体之前,要完成初始化.初始化const或者引用类型数据成员的唯一机会是在构造函数初始化列表中.

         另外,当成员需要使用初始化列表时,通常常规的使用构造函数初始化列表就可避免发生编译时错误.

12.构造函数初始化列表仅指定用于初始化成员的值,并不指定这些初始化执行的次序.成员被初始化的次序就是定义成员的次序.

13.一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数.对于指针和数组,只有定义在全局作用域总的对象才初始化.当对象定义在局部作用域中时,内置或复合类型的成员不进行初始化.

         实际上,如果定义了其他构造函数,则提供一个默认的构造函数几乎总是对的.通常在默认构造函数中给成员提供的初始值应该指出该对象是空的.

可以将构造函数声明为explicit,来防止在需要隐式转换的上下文中使用构造函数

14.友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以他们不受其声明出现部分的访问控制影响.通常,将友元声明成组的放在类定义的开始或者结尾是个好主意.

15.用友元引入的类名和函数(定义或声明),可以像预先声明的一样使用

16.static和非static成员函数的区别是:static成员函数没有this指针.static成员函数也不被声明为虚函数.

static数据成员必须在类定义体的外部定义(正好一次).另外不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该定义时进行初始化.

原创粉丝点击