面向对象 之 [C++面试题]
说到面向对象,大家第一反应应该就是它的三大特性:封装性、继承性和多态性。那么我们先简单的了解一下这三大特性:
(1)封装性:封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
在C++中类中成员的属性有:public, protected, private,这三个属性的访问权限依次降低。
(2)继承性:继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
(3)多态性:多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。实现多态,有二种方式,覆盖,重载。
覆盖,是指子类重新定义父类的虚函数的做法。
重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
下面开始我们今天的学习。
1、C++中空类默认产生哪些类成员函数?
答案:
对于一个空类,编译器默认产生4个成员函数:
(1)默认构造函数
(2)析构函数
(3)拷贝构造函数
(4)赋值函数
2、结构是否可以有构造函数、析构函数及成员函数?如果可以,那么结构和类还有什么区别吗?
答案:
区别是class中变量默认是private,struct中的变量默认是public。class继承默认是private继承,而struct继承默认是public继承。struct可以有构造函数、析构函数,之间也可以继承甚至是多重继承,等等。C++中的struct其实和class意义一样,唯一不同就是struct里面默认的访问控制是public,class中默认访问控制是private。C++中存在struct关键字的唯一意义就是为了让C程序员有个归属感,是为了让C++编译器兼容以前用C开发的项目。
3、下面程序打印出的结果是什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include<iostream> using namespace std; class base { private : int m_i; int m_j; public : base( int i ) : m_j(i),m_i(m_j) {} base() : m_j(0),m_i(m_j){} int get_i() { return m_i;} int get_j() { return m_j;} }; int main () { base obj(98); cout << obj.get_i() <<endl<< obj.get_j() <<endl; return 0; } |
解析:本题想得到的结果是“98,98”。但是成员变量的声明是先 m_i ,然后是 m_j;初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的,因此,先初始化 m_i,但此时 m_j 还未初始化,m_i 会被赋予一个随机值。改变一下成员变量的声明顺序可以得到预想的结果。
答案:
输出结果第一个为随机数,第二个是98。
4、下面这个类声明正确吗?为什么?
1
2
3
4
|
class A { const int Size = 0; }; |
解析:这道程序题存在着成员变量问题。常量必须在构造函数的初始化列表里初始化或者将其设置成static。
答案:
正确的程序如下:
1234567class
A
{
A()
{
const
int
Size = 1;
}
};
或者:
1234class
A
{
static
const
int
Size = 1;
};
5、析构函数可以为 virtual 型,构造函数则不能,为什么?
答案:
虚函数采用一种虚调用的办法。虚调用是一种可以在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。但是如果要创建一个对象,你势必要知道对象的准确类型,因此构造函数不能为 virtual。
6、如果虚函数是非常有效的,我们是否可以把每个函数都声明为虚函数?
答案:
不行,这是因为虚函数是有代价的:由于每个虚函数的对象都必须维护一个 v 表,因此在使用虚函数的时候会产生一个系统开销。如果仅是一个很小的类,且不行派生其他类,那么根本没必要使用虚函数。
7、请看下面一段程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#include<iostream> using namespace std; class B { private : int data; public : B() { cout<< "defualt constructor" <<endl; } ~B() { cout<< "destructed " <<endl; } B( int i) : data(i) { cout<< "constructed by parameter" <<data<<endl; } }; B Play( B b ) { return b; } int main () { B temp = Play(5); return 0; } |
问题:
(1)该程序输出结果是什么?为什么会有这样的输出?
(2)B( int i ) : data( i ),这种用法的专业术语叫什么?
(3)Play( 5 ),形参类型是类,而5是个常量,这样写合法吗?为什么?
答案:
(1)输出结果如下:
123constructed by parameter
//在Play(5)处,5通过隐含的类型转换调用了B::B( int i )
destructed
//Play(5) 返回时,参数的析构函数被调用
destructed
//temp的析构函数被调用;temp的构造函数调用的是编译器生存的拷贝构造函数
(2)待参数的构造函数,冒号后面的是成员变量初始化列表(member initialization list)
(3)合法。单个参数的构造函数如果不添加explicit关键字,会定义一个隐含的类型转换;添加explicit关键字会消除这种隐含转换。
8、编写类 String 的构造函数、析构函数和赋值函数。
已知类 String 的原型为:
1
2
3
4
5
6
7
8
9
10
|
class String { public : String( const char *str = NULL); //普通构造函数 String( const String &other); //拷贝构造函数 ~String( void ); //析构函数 String & operate =( const String &other); //赋值函数 private : char *m_data; //用于保存字符串 }; |
答案:
1、 String 的析构函数:
1234String::~String(
void
)
{
delete
[] m_data;
}
2、String 的构造函数:
1234567891011121314String::String(
const
char
*str)
{
if
(NULL==str)
{
m_data =
new
char
[1];
*m_data =
'\0'
;
}
else
{
int
length =
strlen
(str);
m_data =
new
char
[length+1];
strcpy
(m_data,str);
}
}
3、String的拷贝构造函数:
123456String::String(
const
String &other)
{
int
length =
strlen
(other.m_data);
m_data =
new
char
[length+1];
strcpy
(m_data,other.m_data);
}
4、String的赋值函数:
123456789101112String & String::operate =(
const
String &other)
{
if
(
this
== &other)
//检查自复制
{
return
*
this
;
}
delete
[] m_data;
//释放原有的内存资源
int
length=
strlen
(other.m_data);
//分配新内存资源,并复制内容
m_data =
new
char
[length+1];
strcpy
(m_data,other.m_data);
return
*
this
;
//返回本对象的引用
}
9、重载与覆盖有什么不同?
答案:
虚函数总是在派生类中被改写,这种改写被称为“override”(覆盖)。
override 是指派生类重写基类的虚函数,重写的函数必须有一致的参数表和返回值。Override这个单词好像一直没什么合适的中文词汇来对应。有些人译为“覆盖”,还贴切一些。
overload约定成俗地被翻译为“重载”,是指编写一个与自己已有函数同名但是参数表不同的函数。例如一个函数既可以接受整型数作为参数,也可以接收浮点数作为参数。重载不是一种面向对象的编程,而是一种语法规则,重载与多态没什么直接关系。
面向对象 之 [C++面试题]的更多相关文章
- Java核心技术及面试指南 面向对象部分的面试题总结以及答案
问题2.7.1,开放性问题,说一下你对面向对象思想的了解. 要点1,先说基础概念,比如面向对象思想包括封装.继承.多态,然后说些语法,比如可以通过extends继承类.通过implement来实现接口 ...
- .NET常见面试题
面试题 1 什么是 CTS.CLS 和CLR 公共语言运行库(CLR)是一个CLI 的一个实现,包含了.NET 运行引擎和符合 CLI 的类库. 通用类型系统(CTS)包含在微软公司提交的 CLI ...
- 阶段01Java基础day10面向对象05
10.01_面向对象(package关键字的概述及作用) A:为什么要有包 将字节码(.class)进行分类存放 B:包的概述 C:包的作用 10.02_面向对象(包的定义及注意事项) A:定义包的格 ...
- day10<面向对象+>
面向对象(package关键字的概述及作用) 面向对象(包的定义及注意事项) 面向对象(带包的类编译和运行) 面向对象(不同包下类之间的访问) 面向对象(import关键字的概述和使用) 面向对象(四 ...
- 10 面向对象(package关键字的概述及作用)
10.01_面向对象(package关键字的概述及作用) A:为什么要有包 *开发时有很多类,如果放在一个文件夹中不方便管理,而且容易重复 将字节码(.class)进行分类存放 包其实就是文件夹 B: ...
- JavaEE基础(十)
1.面向对象(package关键字的概述及作用) A:为什么要有包 将字节码(.class)进行分类存放 包其实就是文件夹 B:包的概述 举例: 学生:增加,删除,修改,查询 老师:增加,删除,修改, ...
- 黑马程序员_Java基础视频-深入浅出精华版--视频列表
\day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...
- 课程2:《黑马程序员_Java基础视频-深入浅出精华版》-视频列表-
\day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...
- php面向对象面试题
php面试题之四--PHP面向对象(基础部分) 四.PHP面向对象 1. 写出 php 的 public.protected.private 三种访问控制模式的区别(新浪网技术部) public:公有 ...
随机推荐
- KNOCKOUTJS DOCUMENTATION-绑定(BINDINGS)-自定义绑定
除了ko内建的绑定,还可以自定义绑定,灵活地封装复杂的行为使之可重用. 自定义绑定 注册自定义绑定 向 ko.bindingHandles添加一个子属性来注册一个绑定. ko.bindingHandl ...
- 22、集合(Collection)
一.集合(Collection) 1.简介 Collection是一个接口,其定义了集合的相关功能方法.Collection继承了Iterable接口,而Iterable接口有一个方法Iterator ...
- 原创+转发:微信小程序navigator、redirectTo、switchTab几种页面跳转方式
什么是事件? 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 详解(以常见的tap点击事情为例) 模板.wxml代码: <view id="tapTest ...
- .net连接MySQL的方法
摘自:http://www.cnblogs.com/huayangmeng/archive/2011/04/06/2006866.html 最近要用C#做一个东西,连接之前项目的数据库(用MySQL建 ...
- jquery实现 批量右移
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- HDUOJ----2512一卡通大冒险
一卡通大冒险 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 从零开始的 Python 爬虫速成指南
序 本文主要内容:以最短的时间写一个最简单的爬虫,可以抓取论坛的帖子标题和帖子内容. 本文受众:没写过爬虫的萌新. 入门 0.准备工作 需要准备的东西: Python.scrapy.一个IDE或者随便 ...
- leetcode719:直线上的第k近点对
问题描述 给定数组a[N],可以确定C(N,2)个点对,也就确定了C(N,2)个距离,求这些距离中第k小的距离(k<C(N,2)). 思路 看到第k小.第k大这种问题,首先想到二分法. 把求值问 ...
- linux常见面试题及答案
1. 在Linux系统中,以文件方式访问设备. 2. Linux内核引导时,从文件/etc/fstab中读取要加载的文件系统. 3. Linux文件系统中每个文件用i字节来标识. 4. 全部磁盘块由四 ...
- Google map API V3
本文主要总结Google map API V3使用中最简单也是最常见的一些操作以及相关概念,如果需要更加详细的信息,请直接阅读Google提供的关于map的文档. google map api v3文 ...