没有合适的资源?快使用搜索试试~ 我知道了~
C++ 面试题精选
需积分: 10 20 下载量 189 浏览量
2017-12-26
18:40:08
上传
评论 2
收藏 41KB DOCX 举报
温馨提示
试读
18页
包括关于C++的一些问答题、填空题、选择题、改错题、编程题等
资源推荐
资源详情
资源评论
面试题精髓
1.、为什么构造函数不能声明为虚函数?
解析:因为虚函数采用的是虚调用的方法,虚调用是指允许在只知道部分信息的情况
下
的工作机制,特别允许我们调用一个只知道接口而不知道其对象的准确类型的函数。
但是如果我们要调用构造函数创建对象时,必须要知道对象的准确类型,
因此构造函数不能为虚函数。
2.C++中哪些函数不能被声明为虚函数?
解析:普通函数(非成员函数),构造函数,内联成员函数、静态成员函数、友元函
数。
(1)虚函数用于基类和派生类,普通函数所以不能
(2)构造函数不能是因为虚函数采用的是虚调用的方法,
(3)内联成员函数的实质是在调用的地方直接将代码扩展开
(4)继承时,静态成员函数不能被继承的,它只属于一个类,因为也不存在动态联编
(5)友元函数不是类的成员函数,因此也不能被继承
3.类的静态成员和非静态成员有何区别?
答:类的静态成员每个类只有一个,静态成员为所有类的实例对象共享,静态成员有静态
成员变量和静态成员函数,静态成员变量使用前必须初始化,静态成员变量可以被静态成
员函数和非静态成员函数访问,而静态成员函数只能访问静态成员变量,因为静态成员函
数属于类,其没有 this 指针。非静态成员每个对象都有一个。
重载()和重写(,有的书也叫做“覆盖”)的区别?
重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,
或许两者都不同)。ŸŸŸŸŸ重写:是指子类重新定义复类虚函数的方法。ŸŸŸŸŸ从实现原理上来说:重载:编
译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对
于编译器来说是这样的)。如,有两个同名函数:funconfunc(p:integer):integer;和 funconfun
c(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的: int_func、str_func.对于
这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了
(早绑定),因此,重载和多态无关!ŸŸŸŸŸ重写:和多态真正相关。当子类重新定义了父类的虚函数后,
父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是
无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑
定)
简述成员函数、全局函数和友元函数的差别。Ÿ
成员函数只能由该类所实例化的对象来进行调用。[静态成员除外]
全局函数可以在任意位置进行调用。Ÿ
友元函数可以让本类和友元类对象调用。Ÿ
用 new 分配的内存用 delete 删除用 new[]分配的内存用 delete[]删除 delete[]会调用数
组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用 delete 时
没用括号,delete 就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。Ÿ
6.继承的优缺点。Ÿ
类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变父类的实现。
但是类继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时
刻改变从父类继承的实现。更糟的是,父类通常至少定义了子类的部分行为,父类的任何
改变都可能影响子类的行为。如果继承下来的实现不适合解决新的问题,则父类必须重写
或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。Ÿ(待补充)Ÿ
ŸŸ
7.C++有哪些性质(面向对象特点)Ÿ
封装,继承和多态。Ÿ
在面向对象程序设计语言中,封装是利用可重用成分构造软件系统的特性,它不仅支持系
统的可重用性,而且还有利于提高系统的可扩充性;消息传递可以实现发送一个通用的消
息而调用不同的方法;封装是实现信息隐蔽的一种技术,其目的是使类的定义和实现分离。
8. 在什么时候需要使用“常引用”?ŸŸ
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,
就 应使用常引用。常引用声明方式:const类型标识符Ÿ&引用名=目标变量名;
inta
constint&ra=a;
ra=1;//错误Ÿ
a=1;//正确ŸŸ
例 2stringfoo();
voidbar(string&s);
那么下面的表达式将是非法的:Ÿ
bar(foo());
bar("helloworld");
原因在于 foo()和"helloworld"串都会产生一个临时对象,而在 C++中,这些临时对象
都是 const 类型的。因此上面的表达式就是试图将一个 const 类型的对象转换为非 const
类型,这是非法的。引用型参数应该在能被定义为 const 的情况下,尽量定义为 const
9.ASSERT()是干什么用的Ÿ
答:ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如
果表达式为 FALSE(0),
程序将报告错误,并终止执行。如果表达式不为 0,则继续执行后面的语句。这个宏通常
原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同
时也便于查找错误。例如,变量 n 在程序中不应该为 0,如果为 0 可能导致错误,
10.实现多态的方法?
解析: ①Ÿ一个基类的引用可以指向它的派生类实例
②一个基类的指针可以指向它的派生类实例
11.面向对象的三个基本特征,并简单叙述之?
① 封 装 : 将 客 观 事 物 抽 象 成 类 , 每 个 类 对 自 身 的 数 据 和 方 法 实 行 访 问 控 制 (private,
protected,public)
②继承:广义的继承有三种实现形式:
实现继承(指使用基类的属性和方法而无需额外编码的能力)
可视继承(子窗体使用父窗体的外观和实现代码)
接口继承(仅使用属性和方法,实现滞后到子类实现)。
前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方
式。
③多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可
以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子
类类型的指针赋值给父类类型的指针。
补充问题: 多态的作用?
主要是两个:
1.隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;
2.接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确
调用。
12 重载(和重写,有的书也叫做“覆盖”)的区别?
①重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参
数类型不同,或许两者都不同)。
②重写:是指子类重新定义父类虚函数的方法。
从实现原理上来说:
①重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了
不同的函数(至少对于编译器来说是这样的)。对于这类函数的调用,在编译期间就已经确
定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态
无关!
②重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的
子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用
的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)
多态的作用?
主要是两个:
①隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;
②接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确
调用。
、中的空类,默认产生的类成员函数:
class
{
public:
Empty();//缺省构造函数
Empty(constEmpty&);//拷贝构造函数
~Empty();//析构函数
Empty&operator=(constEmpty&);//赋值运算符
Empty*operator&();//取值运算符
constEmpty*operator&()const;//取值运算符 const
};
15进程间通信的方式有
剩余17页未读,继续阅读
资源评论
qq_29366533
- 粉丝: 2
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功