C++基础系列之要点总结(2)

1.  类内数据成员封装与否(public or private):

未经封装的数据成员,如同原始人生吃肉一样,比较单一、粗暴,不卫生;

而封装后的数据成员,如同现代人吃肉,讲究卫生(数据操作的各种限定),并且吃法多样(数据层次、所属的细分)。

2.  实例化类对象时,初始化列表会优先于构造函数执行;而构造函数本身也可以执行初始化的工作,so初始化列表存在的意义是?

对于一般的成员变量,二者都可对其初始化。但是,对于常量成员变量或者实例化没有默认构造函数的类时,则必须通过构造函数的初始化列表对其进行初始化。

3.  C++支持函数重载(同时对.cpp和.h文件中的函数名进行倾轧,即编译时按照一定的规则重命名函数名),而C不支持函数重载(不会对.c和.h文件中的函数名进行倾轧)。当在C++工程中引入C库时,C源文件中函数名不会被倾轧,但C++源文件中include的C头文件中的函数名会被倾轧。这样,连接时就会报错,应在头文件添加extern “C”{包含所有的C函数名声明}。

4.  命名空间(Namespace),主要针对大型项目提供的便利,以防止多个团队或个人的代码整合在一起时出现同名的函数或是全局变量而发生命名冲突(为每个对象找个主)。

5.  内联函数(inline),C++中宏函数的另一种用法,通常在函数定义前加关键字inline得以实现。预处理时,内联函数会在被调处展开,程序运行时,避免了函数调用所带来的入栈出栈等时间开销,但显然程序所耗空间也会增加。由于内联函数在预处理时被展开,通常会把内联函数定义在头文件中。有两种情况,也会被隐式的定义为内联函数。其一,constexpr修饰的函数,编译器会在编译时验证被修饰函数是否为常量,为了能够在编译过程使该函数可随时被展开,其通常被隐式指定为内联函数;其二,函数体定义在类内部的成员函数。另外,内联函数仅是对编译器的一种请求,如同register一样,是否被编译器执行要看具体情况:如果函数中包含有循环,switch或goto语句,递归函数,含有static的函数,编译器会拒绝此请求。所以,内联函数通常是体量较小,使用频繁的代码块。

6.  C++由隐式的类类型转换所产生的临时对象能否复制给非常量引用

隐式类类型转换所得到的临时对象是右值,而右值不能被非常量引用绑定。右值似乎就是字面值常量吧?只能被常量引用所绑定。

7.  子类继承父类,当父类没有默认构造函数时,需要将父类的构造放在子类构造函数的初始化列表中执行;另外,当子类的私有成员亦有此类型的父类对象时,也需要将其放入子类构造函数的初始化列表。这两种情况下,父类对象的构造顺序与初始化列表的顺序无关,只与父类在子类继承时的声明顺序以及父类对象作为子类私有数据成员时的声明顺序有关。(不过最好一致,因为可能有些编译器有要求)


8.  若子类中有与父类同名的函数,则它将隐藏所有父类的重名函数,即使他们可以构成重载。若仍需访问父类的同名函数,需要加上父类的访问限定符。

9.  子类对象可以直接赋值给父类对象;子类对象的地址可以赋值给父类类型的指针,但该指针仅能访问父类所有的成员,相当于把子类中隐藏的父类对象地址赋值给了该指针;子类对象还可以绑定到父类类型的引用,但其访问规则同指针。

10.子类与父类之间的同名函数隐藏(父类成员函数非虚)与同名函数覆盖(父类成员函数虚,实质是子类成员函数指针覆盖了父类同名虚函数成员指针所在虚表的位置),以及同类类型中函数的重载(满足函数重载的规则)间的差异。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值