1. 关于 隐式类型转换 : 就4个规则来着:
(1)防止 损失 , 向更加 精确的 转换, 比如一个 表达式 1.0/2,就会 把结果向 1.0的double类型转换
(2) 转换为 左值的 类型
(3)转化 为 形参 的类型
(4)转换为 函数 的返回值 规定的 类型
2.关于 静态成员数据 和 静态成员函数 :
(1)静态成员 数据 一般(有一个特例) 只能在 类内声明 ,类外初始化 ,不知道啥原因
(2)静态 成员 函数 类内 类外 定义都可以 , 没有关系
3.“缺省参数 ” 就是 “ 默认参数 ”的 意思
4.定义和声明分开的,只能在声明中设置默认参数
5.TEST1 a[3], *p[2]; //也就是说,指向类的指针 不会调用 类的构造函数,逻辑上合理
6.涉及到 菱形继承的 时候 , 无论时 数据成员 还是 函数 成员 ,只要没有 采用 virtual虚继承 ,都会 在最底层的那个类中 产生 2个成员, 同时记得 涉及到 “虚基类”的构造次序的 问题,先深度遍历构造 所有的虚类 , 然后 按照从左到右的 顺序(这个时 继承的 声明次序,里面时 继承的 从上到下的 次序)构造 非虚基类
7.在这里说明一个纠结了好久的问题,就关于 拷贝构造函数的调用的问题:
(1)这里说明一下,拷贝构造函数的 调用的 3种情况:
第一, 用一个其它的类对象 初始化一个 另一个对象的 时候
第二,当 一个类 对象的值 作为 函数的形参的时候
第三,当一个 函数 调用完之后 返回一个 类对象的 值的 时候
(2)注意,返回一个 类 对象的值 的时候 返回的 是一个 右值 , 所以 不一定会调用 赋值运算符重载, 只有在 将这个右值 赋值 给 一个左值的 时候才会 调用 拷贝赋值运算符 重载函数
8.关于 3个 “常”:
(1)常 成员数据, 必须利用 初始化 列表进行初始化
(2)常 成员函数, 不能修改 成员数据的 值 + 和非const成员函数 是构成 函数 重载的
(3)常 对象 : const Person p, 这个对象 只能 使用 常成员数据 和 常 成员函数 , 但是 并不是说 里面的 数据 和 函数都是 const的
9.区别:
(1)如果 是在 栈区 设置 类类型的指针, 那么 并不会马上为对象 分配 空间, 也就不会调用 构造函数
(2)但是, 如果是 在 堆区 设置 类 类型的指针, 那么 就会在堆区 为这些对象分配空间 , 也就是会调用 相应数量的 默认构造函数
10.基类 中的 析构函数 声明为虚函数的case: 需要使用 动态绑定 ,并且 利用 基类指针指向 派生类对象, 然后需要删除 派生类中的 堆区资源, 基类虚函数 需要 在派生类中 重写, 而且 会先调用 派生类的 析构函数,然后调用 基类的析构函数
11.关于 模板函数 和 非模板函数的 重载 , 其它的要素都相等时,重载机制将优先选择调用非函数模板而不是函数模板, 调用的 优先级 不同,
(2)其它 一些 可以推断 的情况 ,就看blog,juliosun的博客_CSDN博客-Matlab,C++/C,Unix&Linux领域博主
12.突然悟了,在 类模板 外部定义 成员函数 ,
(1)template<typename T1,typename T2> void Person<T1,T2>::func()
{
......
}
(2)特别注意 , Person<T1,T2> 才是 这个 模板类 的 完整 名称
13. 虚函数 是不可以作为 模板类的 成员函数的 ,理由如下:
虚函数表存储着该类的所有的虚函数的地址,因此,虚函数为模板函数时,该表的大小是不知道的,因此编译器禁止!
14.派生类的 析构函数 不可以 显示调用 基类的 析构函数的 原因:
构造函数不同的是,在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数,编译器知道如何选择,无需程序员干涉。
15.