- explicit关键字。这个关键字只在带有一个参数的构造函数的定义中有意义。当我们说一个构造函数是explicit,意思是,只有在用户明确地调用这个构造函数的地方,编译器才能使用这个构造函数。
Vec<int> vi(100); //ok Vec<int> vi = 100; //error
- 操作符重载函数的关键字为operater,比如重载[]时
T& operator[] (size_type i){return data[i]);
- 可以在子类中使用与父类同命的成员函数,如果要使用父类的成员函数,要加父类的限定符
double Grad::grade() const { return (Core::grade(), thesis); }
- 一个派生类的初始化过程
- 为整个对象分配空间(包括基类成员和派生类成员你)
- 调用基类的构造函数来初始化对象中的基类部分
- 使用构造函数初始化列表初始化派生类的成员
- 如果派生类的构造函数的函数体中有语句,就执行这些语句
- 派生类对象是如何构造的,执行Grad g;会使系统分配足够的空间来保存Grad的5个数据元素,再执行Core的默认构造函数来初始化g的Core部分的数据元素,然后执行Grad的默认构造函数。
- 系统会通过查看引用c1和c2实际绑定的类型,来确定执行哪个类的grade函数。也就是说,系统会通过检查作为参数传递给compare_grades函数的每个对象,来事确定执行哪个类的grade函数。
- 虚函数只能用在类定义中
- 动态绑定是在运行时绑定,相反,静态绑定发生在编译时期。如果我们用一个对象来调用一个虚函数,这个调用就是静态绑定的,因为除了编译时期,对象的类型不可能在执行的过程中发生变化。相反如果通过一个指针或者引用来调用一个虚函数,这个函数就是动态绑定的。
- OOP的核心概念就是多态:一个类型可以代表多种类型。C++是通过虚函数的动态绑定来实现多态调用。引用和指针的类型是确定的,但是它们引用或指向的对象的类型可以是引用或指针的类型,也可以是从它们本身的类型继承而来的任何类型。
- 虚函数是必须定义的,不管程序是否调用它们。
- 在指针上调用一个delete时,会发生两件事:1)对象的析构函数会被调用;2)包含这个对象的空间会被释放
- 在用基类的指针来销毁派生类的对象时,就需要虚析构函数sa