C++知识点(3)

内联函数

内联函数相当于自动地用函数的形式添加进代码,可以提高效率。编译器会对内联函数的参数做安全检查或自动类型转换,而宏定义不会。
内联函数可以访问类的私有成员变量,而宏定义则不能,在类中声明同时定义的成员函数,自动转化为内联函数。

继承机制中对象之间的转换

从派生类向基类的类型转换只对指针和引用类型有效。基类向派生类不存在隐式类型转换,使用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)— 一般由程序员分配释放࿰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值