1.c++ 三大特性,封装、继承、多态
封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的类进行信息隐藏
继承:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展,但是基类的构造函数、复制构造函数、析构函数、赋值运算符不能被派生类继承
(1)友元函数:
友元函数他不属于该类的成员函数,他是定义在类外的普通函数,只是在类中声明该函数可以直接访问类中的private或者protected成员
友元函数可以访问类中的私有成员和其他数据,但是访问不可直接使用数据成员,需要通过对对象进行引用。
一个类中的成员函数可以是另外一个类的友元函数,而且一个函数可以是多个类友元函数。
(2)公有继承:
public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
(3)私有继承:
private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用
(4)保护继承:
对于其他的外部class,protected就变成private
多态:一个类实例的相同方法在不同情形有不同表现形式。多态实现的两种方式:将子类对象的指针赋给父类类型的指针或将一个基类的引用指向它的派生类实例。
多态指同一个实体同时具有多种形式。虚函数、重载和重写等,这些放在外面进行详细的说明。
2.重载(Overloading)和重写(Overriding)
重写(Overriding):如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。
重载(Overloading):如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的
静态绑定(编译时绑定,通过对象调用):函数重载
动态绑定(运行时绑定,通过地址实现):虚函数
3.虚函数、虚函数表(虚函数指针怎么保存的)、纯虚函数 ----- 必考经典题
(1)虚函数
实现多态所必须,父类类型的指针指向子类的实例,执行的时候会执行之类中定义的函数。
(2)纯虚函数
纯虚函数就是定义了一个虚函数但并没有实现,原型后面加"=0"。包含纯虚函数的类都是抽象类,不能生成实例。
(3)虚函数表
建议看这篇文章,里面说的很好还有一定要好好理解一般BAT都喜欢问这种问题。
转载:http://blog.csdn.net/haoel/article/details/1948051/
4.构造和析构
(1)构造函数
c++构造函数可以分为四类
默认构造函数
初始化构造函数
复制(拷贝)构造函数
转换构造函数
转载:http://blog.csdn.net/y780465649/article/details/52335835
(2)构造函数中可以调用虚函数吗
就算调用虚函数也不起作用,调用虚函数同调用一般的成员函数一样。
(3)析构函数中可以调用虚函数吗
可以调用会跟普通函数一样的,析构函数中调用虚函数也不起作用,调用虚函数同调用一般的成员函数一样。析构函数的顺序是先派生类后基类,有可能内容已经被析构没了,所以虚函数不起作用。
(4)构造初始化的执行顺序
构造时
父类的构造函数 --> 子类的构造函数
析构时
子类的析构函数 --> 父类的析构函数
(5)构造函数可以是虚函数吗:
构造函数不能是虚函数,每个对象的虚函数表指针是在构造函数中初始化的,因为构造函数没执行完,所以虚函数表指针还没初始化好,构造函数的虚函数不起作用,所以构造函
数不能是虚函数。
(6)虚析构函数:
如果有子类的话,析构函数必须是虚函数。否则析构子类类型的指针时,析构函数有可能不会被调用到。
5.拷贝构造函数,深拷贝、浅拷贝
深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。
可以看看 转载:http://blog.csdn.net/zzwdkxx/article/details/51769595
6.struct和类的区别、类的成员变量
(1)struct和类的区别
struct是公有的。而类可以是私有和受保护的。
struct和class大体相似,但是区别的访问权限 struct默认的访问权限是public,class默认是private
(2)一个类没有定义属性和函数sizeof大小是多少,编辑器为什么这么做?
一个空类对象的大小是1byte。这是被编译器安插进去的一个字节,这样就使得这个空类的实例得以在内存中配置独一无二的地址
7.引用和指针
(1)引用和指针有什么区别?
1).引用必须初始化
2).引用不能为空
3).引用在赋值之后不能修改
4.)指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作,而引用是相应对象的别名。
(2)将引用作为函数参数和返回值有哪些特点?有哪些注意事项?
作为函数参数时候不产生拷贝,直接传递内存地址的值。
作为返回值的时候必须的有效的,而指针可以是无效,例如空指针等等