面向对象 之 [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。

答案:

正确的程序如下:


1

2

3

4

5

6

7

class A

{

    A()

    

        const int Size = 1;

    

};

或者:


1

2

3

4

class 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)输出结果如下:


1

2

3

constructed 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 的析构函数:


1

2

3

4

String::~String(void)

{

    delete [] m_data;

}

2、String 的构造函数:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

String::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的拷贝构造函数:


1

2

3

4

5

6

String::String(const String &other)

{

    int length = strlen(other.m_data);

    m_data = new char[length+1];

    strcpy(m_data,other.m_data);

}

4、String的赋值函数:


1

2

3

4

5

6

7

8

9

10

11

12

String & 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约定成俗地被翻译为“重载”,是指编写一个与自己已有函数同名但是参数表不同的函数。例如一个函数既可以接受整型数作为参数,也可以接收浮点数作为参数。重载不是一种面向对象的编程,而是一种语法规则,重载与多态没什么直接关系。

时间: 2024-08-11 07:28:51

面向对象 之 [C++面试题]的相关文章

UML面向对象分析与设计试题2008-B卷

UML面向对象分析与设计试题2008-B卷 UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 提交APPStore流程http://www.360doc.com/content/15/0203/15/19663521_445974056.shtml

10 面向对象(package关键字的概述及作用)

10.01_面向对象(package关键字的概述及作用) A:为什么要有包 *开发时有很多类,如果放在一个文件夹中不方便管理,而且容易重复 将字节码(.class)进行分类存放 包其实就是文件夹 B:包的概述 举例: 学生:增加,删除,修改,查询 老师:增加,删除,修改,查询 - 方案1:按照功能分 com.heima.add AddStudent AddTeacher com.heima.delete DeleteStudent DeleteTeacher com.heima.update U

2014-2015-2试题

2014-2015-2信息系统分析与设计(面向对象设计)开卷考试试题. 自我感觉考试不及格的同学,建议买块豆腐自己撞死好了. A卷 : 一.论述题:依赖注入模式 1.何为依赖注入模式(4分) 2.使用Java代码介绍依赖注入的三种方式(6分) 3介绍注入工具或框架,使用配置文件的优缺点(10分). 二.论述题:Parnas原则是软件工程中最重要的原则 1.什么是Parnas原则,什么是定义良好的接口(5分) 2.从Java接口与其实现,阐述Parnas原则的推广(10分) 3.什么是信息隐藏(5

day10&lt;面向对象+&gt;

面向对象(package关键字的概述及作用) 面向对象(包的定义及注意事项) 面向对象(带包的类编译和运行) 面向对象(不同包下类之间的访问) 面向对象(import关键字的概述和使用) 面向对象(四种权限修饰符的测试) 面向对象(类及其组成所使用的常见修饰符) 面向对象(内部类概述和访问特点) 面向对象(成员内部类私有使用) 面向对象(静态成员内部类) 面向对象(成员内部类的面试题) 面向对象(局部内部类访问局部变量的问题) 面向对象(匿名内部类的格式和理解) 面向对象(匿名内部类重写多个方法

.NET常见面试题

面试题 1  什么是 CTS.CLS 和CLR 公共语言运行库(CLR)是一个CLI 的一个实现,包含了.NET 运行引擎和符合 CLI 的类库. 通用类型系统(CTS)包含在微软公司提交的 CLI 规范,定义了一个可以在 CLR 上运行的类型规范. 公共语言规范是 CTS的一个子集,定义了所有面向.NET 的程序所需要符合的最小规范集. 面试题 2   CLR 技术和 COM技术的比较 CLR 和 COM 都定义了组件间交互的规范.COM 并没有定义如何描述组件间的依赖性,并且由于其严格的物理

JavaEE基础(十)

1.面向对象(package关键字的概述及作用) A:为什么要有包 将字节码(.class)进行分类存放 包其实就是文件夹 B:包的概述 举例: 学生:增加,删除,修改,查询 老师:增加,删除,修改,查询 ... 方案1:按照功能分 com.heima.add AddStudent AddTeacher com.heima.delete DeleteStudent DeleteTeacher com.heima.update UpdateStudent UpdateTeacher com.hei

java面向对象面试题

面试题目录:     一.JAVASE常见面试题 1. static和final区别?使用final关键字修饰一个变量时,           是引用不能变,还是引用的对象不能变?         2. "=="和equals方法究竟有什么区别?          3.  静态变量和实例变量的区别?         4.请说出作用域public,private,protected,以及不写时的区别            这四个作用域的可见范围如下表所示.         5.Overl

.net必问的面试题系列之面向对象

上个月离职了,这几天整理了一些常见的面试题,整理成一个系列给大家分享一下,机会是给有准备的人,面试造火箭,工作拧螺丝,不慌,共勉. 1.net必问的面试题系列之基本概念和语法 2.net必问的面试题系列之面向对象 3.net必问的面试题系列之设计模式 4.net必问的面试题系列之集合.异常.泛型 5.net必问的面试题系列之简单算法 6.net必问的面试题系列之数据库 7.net必问的面试题系列之web前端 问题目录 1.通常采用的访问修饰符有哪五种 2.多态的理解 3.什么是构造函数 4.重写

java 面向对象 面试题

2. java是如何做到跨平台的?源程序(java)--字节码(二进制class)--类装载器(加载)—字节码检验器—解释器(不同版本,跨平台根本原因)---操作系统平台(编译加解释语言)编译:产生一个新文件.解释:没有新文件产生.3.java程序员的执行过程是怎样的?先由程序员书写java源文件,再由javac(编译)命令操作源文件将其编写为class文件,在通过java(运行)命令进入类加载器,再有字节码检效器对其检验,无误后通过解释器解释给操作系统执行.4.JDK和JRE的区别是什么?开发