内联函数
内联函数相当于自动地用函数的形式添加进代码,可以提高效率。编译器会对内联函数的参数做安全检查或自动类型转换,而宏定义不会。
内联函数可以访问类的私有成员变量,而宏定义则不能,在类中声明同时定义的成员函数,自动转化为内联函数。
继承机制中对象之间的转换
从派生类向基类的类型转换只对指针和引用类型有效。基类向派生类不存在隐式类型转换,使用dynamic_cast。
虚函数、虚函数表的内存分配
对于无虚函数覆盖的继承:虚函数按照其声明顺序放在虚函数表中;父类的虚函数在其子类的虚函数的前面。
对于有虚函数覆盖的继承:派生类中起覆盖作用的虚函数放在原基类虚函数的位置;没有被覆盖的虚函数依旧。
对于无虚函数覆盖的多重继承:每个父类都有自己的虚函数表;派生类的虚函数被放在了第一个父类的虚函数表中(按照声明顺序排序)。
对于有虚函数覆盖的多重继承:派生类中起覆盖作用的虚函数放在原基类虚函数的位置;没有被覆盖的虚函数依旧。
explicit的作用
防止编译器对单参数的构造函数的隐式转换。
class int_proxy {
public:
int_proxy(int n) : _m(n) {};
public:
int value() const {
return _m;
}
private:
int _m;
};
//
test_int_proxy(100);
类构造函数隐式转换的必要条件:
1. 找不到传参类型严格对应的函数
2. 找到传参类型严格匹配的类的构造函数
3. 因为隐式转换构造出的是临时对象,所以不可修改,故触发隐式转换的函数的传参类型必须要使用const修饰
之所以要禁止单参数的类构造函数的隐式转换,是因为隐式转换有时会造成不确定性。
模板特化
通常又有一些特殊的情况,不能直接使用泛型模板展开实现,所以要用到模板特化。一是特化为绝对类型;二是特化为引用,指针类型;三是特化为另外一个类模板。
对于特殊类型, 比如说指针, 其拷贝就和基本数据类型不同.。这时为了处理这种特殊情况就需要类模板特化。
memset、memcpy、strcpy三个函数的区别
1)memset() 函数常用于内存空间初始化,如:char str[100]; memset(str,0,100);
2)memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
3)strcpy就只能拷贝字符串了,它遇到\0就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。
C++程序的内存分配
栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆区(heap)— 一般由程序员分配释放