一、C++中类成员的访问权限?
C++通过public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。在类的内部(定义类的代码内部),无论成员被声明为public、protected 还是private,都是可以互相访问的,没有访问权限的限制。在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问public 属性的成员,不能访问private、protected 属性的成员。
二、C++中struct和class的区别是什么?
在C++中,可以用struct和class定义类,都可以继承。区别在于:structural的默认继承权限和默认访问权限是public,而class的默认继承权限和默认访问权限是private。另外,class还可以定义模板类形参,比如template。
三、什么是右值引用,跟左值又有什么区别?
左值:能对表达式取地址、或具名对象/变量。一般指表达式结束后依然存在的持久对象。
右值:不能对表达式取地址,或匿名对象。一般指表达式结束就不再存在的临时对象。
区别:
1. 左值可以寻址,而右值不可以。
2. 左值可以被赋值,右值不可以被赋值,可以用来给左值赋值。
3. 左值可变,右值不可变(仅对基础类型适用,用户自定义类型右值引用可以通过成员函数改变)。
四、面向对象与泛型编程是什么?
1. 面向对象编程简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
2. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
3. 泛型编程: 让类型参数化,方便程序员编码。
类型参数化: 使的程序(算法)可以从逻辑功能上抽象,把被处理对象(数据)的类型作为参数传递。
五、析构函数可以为virtual 型,构造函数则不能,为什么?
构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。
构造函数不能声明为虚函数的原因是:
虚函数的主要意义在于被派生类继承从而产生多态。派生类的构造函数中,编译器会加入构造基类的代码,如果基类的构造函数用到参数,则派生类在其构造函数的初始化列表中必须为基类给出参数,就是这个原因。虚函数的意思就是开启动态绑定,程序会根据对象的动态类型来选择要调用的方法。然而在构造函数运行的时候,这个对象的动态类型还不完整,没有办法确定它到底是什么类型,故构造函数不能动态绑定。
六、C++中空类默认产生哪些类成员函数?
默认构造函数、拷贝构造函数、析构函数、赋值运算符重载函数、取址运算法重载函数、const取址运算符重载函数
七、面向对象的基本特征有哪些?
抽象、继承、封装、多态
八、什么是深拷贝?什么是浅拷贝?
1.浅拷贝: 指的就是使用系统默认的拷贝构造函数,构造出来的新对象跟原有的对象共用同一块堆空间,一旦某个对象修改了堆空间中的数据,其它对象全部跟着修改,这种现象称之为浅拷贝 2.深拷贝: 程序员自己动手写个拷贝构造函数,解决浅拷贝的bug,这个自定义的拷贝构造函数实现就是深拷贝
九、三种继承
公有继承: 公有成员 保护成员 私有成员
情况一:在子类的外部 ok NO NO
情况二:在子类的内部 ok ok NO
保护继承: 公有成员 保护成员 私有成员
情况一:在子类的外部 NO NO NO
情况二:在子类的内部 ok ok NO
私有继承: 公有成员 保护成员 私有成员
情况一:在子类的外部 NO NO NO
情况二:在子类的内部 ok ok NO
绝大部分情况都采用公有继承
十、全局变量和静态变量的区别是什么?
1. 全局变量的作用域为程序块,而局部变量的作用域为当前函数。
2. 内存存储方式不同,全局变量(静态全局变量,静态局部变量)分配在全局数据区(静态存储空间),后者分配在栈区。
3. 生命周期不同。全局变量随主程序创建而创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在了。
4. 使用方式不同。通过声明为全局变量,程序的各个部分都可以用到,而局部变量只能在局部使用。