C++学习笔记【第一部分第七章:类】

来源:互联网 发布:服装数据分析软件 编辑:程序博客网 时间:2024/06/05 11:16

构造函数
1. 构造函数和类名相同
2. 构造函数的唯一目的就是为数据成员赋初值
3. 访问说明符:public ,private,加强类的封装性
4. struct 和class的唯一区别,默认访问权限不同:struct默认为public,class默认为private
5. 类可以允许其他类或者函数访问它的非公有成员,方法是令其成为该类的友元(声明语句前加friend关键字)

友元函数
6. 友元声明只能出现在类定义的内部,一般是类定义的开始或者结束前。友元函数可以定义在类的内部,这样就是内联函数了。类可以把其它函数,其它类,其它类的成员函数定义为友元
7. 友元的声明只是对访问权限的声明,而非通常意义的函数声明,因此我们需要在友元声明之外专门对函数进行一次声明

类的其它特性
8. 类型成员通常出现在类定义开始的地方,因为定义类型的成员必须先定义后使用
9. 定义在类内部的成员函数是自动inline的
10. 我们应该在头文件中定义inline函数,因为内联函数和constexpr函数可以在程序中多次定义,但他们的定义必须完全一致,所以通常定义在头文件中
11. inline成员函数也应该与相应的类定义在同一个头文件中
12. 如果希望改变类的某个数据成员,可以使用mutable关键字
13. 可变数据成员永远不会是const,一个const成员函数可以改变可变数据成员的值。p245
14. 内类初始值必须用=或者花括号
15. 一个const成员函数如果以引用的形式返回*this,则它的返回类型是常量引用
16. 非常量版本的函数对于常量对象是不可用的,也就是非常量函数不能调用常量对象,我们只能在常量对象上调用const函数
17. 每个类定义了唯一的类型:即使两个类的成员列表完全一样,他们也是不同的类型
18. 一个类的成员,其类型不能是该类自己。当声明过类,但还未定义时,允许此类包含指向它自身类型的引用或者指针
19. 每个类负责控制自己的友元类或友元函数,友元不可传递

类的作用域
1. 编译器处理完类中的全部声明后才会处理成员函数的定义
2. 一般内层作用域可以重新定义外层作用域中名字。然而在类中,如果成员使用了外层作用域中的某个名字,而该名字代表一种类型,则类不能在之后重新定义该名字。P255
3. 类型名的定义通常在类的开始处,这样就能确保所有使用该类型的成员都出现在类名的定义之后

构造函数再探
1. 我们定义变量时一般立即将它们初始化,而非先定义后赋值。就对象的数据成员而言,初始化和赋值也有类似的区别。有时我们可以忽略成员初始化和赋值的区别
2. 但有例外,如果成员是const或者引用,必须将其初始化。
3. 且,当成员属于某种类类型且该类没有定义默认构造函数的时候,也必须初始化这个成员
4. 如果成员是const、引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始化列表对它们进行初始化
5. 最好令构造函数初始值的顺序与成员声明的顺序保持一致,而且如果可能的话避免使用某些成员初始化其它成员
6. 委托构造函数将自己的一些或全部职责委托给了另外的构造函数
7. 在实际中如果定义了其它构造函数,最好也提供一个默认构造函数
8. 如果一个构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制,这个构造函数称作转换构造函数。P264
9. 只允许一步类类型转换
10. 使用explicit关键字声明构造函数,来抑制构造函数定义的隐式转换。 关键字explicit只对只接受一个实参的构造函数有效。且,只能在类内声明构造函数时使用explicit,在类外部定义时不能重复。P265
11. 当我们用explicit关键字声明构造函数,它将只能以直接初始化的形式使用,而不可用于拷贝形式的初始化(用=),因为拷贝初始化的时候会发生隐式转换。
12. 显式转换explicit构造函数:用类名直接强制转换;使用static_cast强制类型转换
13. 聚合类:
● 所有成员都是public
● 没有定义任何构造函数
● 没有类内初始值
● 没有基类,没有纯虚函数
14. 定义数组的时候必须指定类型,不允许用aoto关键字由初始值的列表推断类型。和vector一样,数组的元素应为对象,不存在引用的数组
15. constexpr 函数是能用于常量表达式的函数,其返回类型和所有形参必须是字面值类型,允许其返回值不一定是常量表达式。函数体内有且只有一条return语句。被隐式地指定为内联函数。P214
16. 数据成员都是字面值类型的聚合类是字面值常量类
17. 构造函数不能是const的。p235尚不清楚
18. 一个字面值常量类必须至少提供一个constexpr构造函数

类的静态成员
1. 在类成员的声明之前加上static关键字使得其与类相关联。这个成员是静态成员。
2. 静态成员可以是public或者private,可以是常量,引用,指针,类类型等
3. 类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。
4. 静态成员函数不与任何对象绑定,不包含this指针。
5. 静态成员函数不能声明成const,我们也不能在static函数体内使用this指针。
6. 使用作用域运算符直接访问静态成员
7. 可以在类内或者类外定义静态成员函数,但是在类外定义的时候,不能重复使用static关键字,static只能在类内声明时用
8. 静态数据成员不属于类的任何对象,所以它们并不是在创建类的对象时被定义。也就是说它们不是由类的构造函数初始化。一般,我们不在类的内部初始化静态成员。相反,必须在类外定义和初始化静态成员
9. 类的数据成员定义在任何函数之外,一旦被定义,存在于整个程序的生命周期
10. 要想确保对象只定义一次,最好的办法是把静态数据成员的定义与其他非内联函数的定义放在同一个文件中。p279,尚不完全清楚
11. 类的静态数据成员不应该在类内部初始化,然而我们可以为静态成员提供const整数类型的类内初始值,但要求静态成员是字面值常量类型的constexpr。
12. 即使一个常量静态数据成员在类内部被初始化了,也应该在类外定义一下该成员。
13. 一个类在它声明之后定义之前,是不完全类型。
14. 静态成员独立于任何对象,静态数据成员可以是不完全类型。静态数据成员可以就是它所属类类型。非静态数据成员只能声明成它所属类的指针或引用。
15. 静态成员可以作为默认实参。非静态数据成员不能作为默认实参,它的值本身属于对象的一部分。

原创粉丝点击