面试笔记8(类)

来源:互联网 发布:mac vi编辑器保存退出 编辑:程序博客网 时间:2024/06/05 15:00

1.如果类是以struct关键字定义的,则在第一个访问标号之前的成员是公有的;如果类是用class关键字定义的,则这些成员是私有的。

2.在类内部定义的函数默认为inline函数。每个成员函数(static函数除外),都有一个额外的、隐式的形参this。在调用成员函数时,形参this初始化为调用函数的对象的地址。

3.构造函数可以重载的,构造函数可以设置默认的参数,构造函数在定义类对象时自动执行。

当构造函数的函数体卸载类的定义体内时,构造函数就是内联的。

4.如果没有一个类没有显示定义任何构造函数,编译器将自动为这个类生成默认构造函数。

5.内置或符合类型的成员的初始值依赖于对象的作用域,在局部作用域中这些成员不被初始化,在全局作用域中他们被初始化为0.

6.成员初始化列表  ,以冒号开始。每个成员后面的圆括号中的值作为初始值,多个成员的初始化用逗号分离。

7.成员变量的初始化顺序与变量在类中的声明顺序相同,而他们在构造函数的初始化列表中的顺序无关。

构造函数可以分两个阶段,初始化阶段,普通的计算阶段。

8.没有默认构造函数的类类型成员,以及const类型的成员变量和引用类型的成员变量,都必须在构造函数初始化列表进行初始化。

9.复制构造函数、赋值操作符和析构函数总称为复制控制。编译器自动实现这些操作,但类也可以自己定义。

10.只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为复制构造函数。

可用于:

1)根据另一个同类型初始化一个对象。复制初始化使用=符号,直接初始化放在圆括号中。

2)复制一个对象,将它作为实参传递给一个对象或从函数返回时复制一个对象。

3)初始化顺序容器中的元素。

4)提供元素初始化列表初始化数组元素。

11.一般来说,如果类中定义了虚函数,析构函数也应该定义为虚析构函数,尤其是类内有申请的动态内存,需要清理和释放的时候。

12.发生拷贝构造函数,在最后也会调用析构函数。(对否?)

13.虚继承,首先调用虚基类的构造函数,虚基类如果有多个,则虚基类构造函数的调用顺序是此虚基类在当前派生类表中出现的顺序而不是他们在成员初始化表中的顺序。

所有虚基类的构造函数调用完毕后,在按照多继承中的规则调用其他的构造函数。

14 操作符重载函数的名字为operator后跟着所定义的操作符的符号。重载函数有一个返回值和一个形参表。

15.通过是否有新对象产生,来决定调用的是复制构造函数,还是赋值运算符。

如果产生新对象,则调用的是复制构造函数。如果不产生新对象就是赋值运算符。

复制操作符需要重点关注:

a.返回值的类型为该类型的引用,并且在函数结束前返回值实例自身(*this)只有这样,才可以连续赋值

b.把传入的参数声明为常量引用,避免拷贝构造函数,避免修改传入参数,要加上const

c.一定要在分配新的内存之前释放自己的内存,否则会造成内存泄露。

d.需要判断传入的参数和当前的实例*this是不是同一个实例。用指针判断就可以了。


16.基类的构造函数、复制构造函数、析构函数、赋值运算符重载函数都不能被派生类继承。

17.成员函数的覆盖,必须要求基类函数必须是虚函数。

18.成员函数的隐藏。两个参数不同,无论基类函数是否是虚函数,基类函数都会被屏蔽。

19:注意  一个类只能有一个析构函数。

20.数组创建类的对象时,有几个对象就会调用几次构造函数。删除对象数组时,有几个对象就会调用几次析构函数。




0 0