C++面试题-面向对象-面向对象概念

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liubing8609/article/details/86138470

C++面试题-面向对象-面向对象概念

问:说说C++C的主要区别?

答:

  1. C语言属于面向过程语言,通过函数来实现程序功能。而C++是面向对象语言,主要通过类的形式来实现程序功能。
  2. 使用C++编写的面向对象应用程序比C语言编写的程序更容易维护、扩展性更强。
  3. C++多用于开发上层应用软件,而C语言代码体积小、执行效率高,多编写系统软件和嵌入式开发。

例如:Windows操作系统、Linux操作系统大部分内核都是用C语言编写的。从名称上,可以说C++C语言的超集,它兼容C语言,同时扩充了许多内容,例如面向对象、STL模板库等。总之,C语言属于面向过程编程语言,侧重于函数;而C++属于面向对象编程语言,侧重于类。

 

问:面向对象的程序设计思想是什么?

答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。

 

问:面向对象与面向过程分别是什么?

答:

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;以过程为中心的编程思想,以算法进行驱动。

面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。以对象为中心,以消息进行驱动。

 

问:面向过程与面向对象的优缺点?

答:

面向过程

  1. 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
  2. 缺点:没有面向对象易维护、易复用、易扩展。

面向对象

  1. 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
  2. 缺点:性能比面向过程低。

 

问:面向对对象与面向过程的区别?

答:

  1. 面向过程的思维方式是分析综合。面向对象的思维方式是构造。
  2. 面向过程的程序设计有挑战性,技巧性强。面向对象主要在于对象抽象有技术性,抽象完了后,任何人都可以做后面的工作了。
  3. 对面向过程而言,数据是独立的。在面向对象中,对象本身就提供了存储数据的空间(类的数据成员),这样就是函数的参数传递简单多了,而且提供了数据封装后,数据的访问也变可靠了。

 

问:什么是对象?

答:对象是指现实世界中各种各样的实体。它可以指具体的事物也可以指抽象的事物。

 

问:对象都具有二方面特征是什么?分别是什么含义?

答:对象都具有的特征是:静态特征和动态特征。

静态特征是指能描述对象的一些属性,动态特征是指对象表现出来的行为。

 

问:什么是类?

答:类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程(以及设计)技术。类的接口包括用户所能执行的操作:类的实现则包括类的数据成员、负责接口实现的函数以及定义类所需的各种私有函数。

封装实现了类的接口和实现的分离。封装后的类隐藏了它的实现细节,也就是说,类的用户只能使用接口而无法访问实现部分。类想要实现数据抽象和封装,需要首先定义一个抽象数据类型。在抽象数据类型中,由类的设计者负责考虑类的实现过程;(摘自《Primer c++第五版》)

关于接口和实现分离的技术(某网友的博客文章):https://blog.csdn.net/starlee/article/details/610825

 

问:写出结构体定义与声明的几种形式?

答:struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。

struct tag {

 member-list

} variable-list ;

在一般情况下,tagmember-listvariable-list3部分至少要出现2个。以下为示例:

1. // 此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c。同时又声明了结构体变量s1,这个结构体并没有标明其标签。

struct {

    int a;

    char b;

    double c;

} s1;

2. // 同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c,结构体的标签被命名为SIMPLE,没有声明变量。

struct SIMPLE{

    int a;

    char b;

    double c;

};

// SIMPLE标签的结构体,另外声明了变量t1t2t3

struct SIMPLE t1, t2[20], *t3;

3.// 也可以用typedef创建新类型

typedef struct{

    int a;

    char b;

    double c;

} Simple2;

//现在可以用Simple2作为类型声明新的结构体变量

Simple2 u1, u2[20], *u3;

4.// 此结构体的声明包含了其他的结构体

struct COMPLEX{

    char string[100];

    struct SIMPLE a;

};

// 此结构体的声明包含了指向自己类型的指针

struct NODE{

    char string[100];

    struct NODE *next_node;

};

5. struct B;   

// 对结构体B进行不完整声明

// 结构体A中包含指向结构体B的指针

struct A{

    struct B *partner;

    //other members;

};

// 结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明

struct B{

    struct A *partner;

    //other members;};

 

问:类与结构体的区别是什么?

答:

  1. 只有结构体存在于C语言,结构体和类都存在于C++
  2. C中结构体只涉及到数据结构,在C++中结构体和类体现了数据结构和算法的结合。也就是说在C++中,结构体还可以包含函数,而C语言中不可以。
  3. C语言中结构体没有成员函数,可以被声明为变量、指针和数组等。在C++中由于对结构体进行了扩充,获取了很多功能,当然还可以包含函数。
  4. 访问机制,结构体默认访问的机制是public,而类默认访问机制是private
  5. class继承默认是private继承,而从struct继承默认是public继承。
  6. C++的结构体声明不必有struct关键字,而C语言的结构体声明必须带有关键字(使用typedef别名定义除外)。
  7. 结构体是值类型,而类是引用类型。
  8. 结构体和类同样可以能够继承和实现多态。
  9. C++中,结构体可以继承类,类同样也可以继承结构体,继承过程中注意访问权限。
  10. class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。这一点在Stanley B.Lippman写的Inside the C++ Object Model有过说明。
  11. struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体。
  12. 实例化的类存储在内存的堆内,而结构存储在栈内,结构的执行效率相对较高。
  13. 结构体没有析构函数。

 

问:哪种使用的情况下适合结构体还是类?

答:

  1. 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct
  2. 在表示数据量大、逻辑复杂的大对象时,首选class
  3. 在表现抽象和多级别的对象层次时,class是最佳选择。

 

问:什么是抽象?

答:抽象的作用就是表示同一类事物的本质。例如在c/c++中,数据类型就是对一批具体的数的抽象。

类是对象的抽象,而对象则是类的特例,或者说是实例。

抽象包括两个方面:一是过程抽象,二是数据抽象。

 

问:什么是封装?

答:封装是指可以对一个对象进行封装处理,把它的一部分属性和功能对外界屏蔽,也就是说从外界是看不到的,甚至是不可见的。

封装的特点:

  1. 将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干扰。
  2. 将对象中某些部分对外隐蔽,只留下少数接口,以便与外界联系,接收外界的消息。这种对外界屏蔽的做法称为消息屏蔽。

 

问:继承的作用?

答:采用继承的方法可以很方便地利用一个已有的类建立一个新的类,这就可以重用已有软件中的一部分甚至大部分,节省了编程工作量。

 

问:类的特性?

答:封装(维护性),继承(复用性)和多态(扩展性)。抽象,不属于类的特性,特点是灵活性。

 

问:抽象类是什么?作用是什么?

答:抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层。

  1. 抽象类的定义:称带有纯虚函数的类为抽象类。
  2. 抽象类的作用:抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。所以派生类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些语义,也可以再将这些语义传给自己的子类。
  3. 使用抽象类时注意:抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。抽象类是不能定义对象的。

 

问:什么是接口类?特点是什么?

答:接口类就是只提供接口不提供实现的类,就是接口类,接口类和抽象类对C++而言,没有什么区别。

接口类有如下特点:

  1. 子类来实现接口类中没有实现的所有接口。
  2. 接口方法前面有virtual关键词修饰,并且等于0
  3. 只能被继承,不能独自生成对象。

 

问:什么是友元类?

答:类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友元(friend)。如果类想把一个函数作为它的友元,只需要增加一条以friend关键字开始的函数声明语句即可。

 

问:多重继承与多继承的区别?

答:多继承是指一个子类继承多个父类。多继承对父类的个数没有限制,继承方式可以是公共继承、保护继承和私有继承。

多重继承特点总结如下:

  1. 多重继承与多继承不同,当B类从A类派生,C类从B类派生,此时称为多重继承
  2. 当实例化子类时,会首先依次调用所有基类的构造函数,最后调用该子类的构造函数;销毁该子类时,则相反,先调用该子类的析构函数,再依次调用所有基类的析构函数。
  3. 无论继承的层级有多少层,只要它们保持着直接或间接的继承关系,那么子类都可以与其直接父类或间接父类构成 is a的关系,并且能够通过父类的指针对直接子类或间接子类进行相应的操作,子类对象可以给直接父类或间接父类的对象或引用赋值或初始化。

 

问:在头文件中进行类的声明,在对应的实现文件中进行类的定义有什么意义?

答:这样可以提高编译效率。因为这样不仅文件的代码设计方便,而且只需要编译一次就能够生成.obj文件。再次应用该类的地方,就不会重新编译了。

 

问:如何定义两个类互为成员的情况?以下代码正确吗?

class A

{

public:

private:

 B m_B;

};

class B

{

private:

A m_A;

};

答:不正确。因为在类A之前,没有发现类B的定义,直接使用了类B,但是却没有发现类B的定义,而只是发现了类B的声明。修改代码为:

classB

class A

{

public:

private:

 B *m_B;//或者B m_B();

};

class B

{

private:

A m_A;

};

分析:

本题笔者认为主要考点是类的定义与声明的区别。

B m_B只是类B的声明,而 B *m_B;//或者B m_B();是类B的定义。

当我们new出一个对象(B *m_B),就会自动调用构造函数完成初始化,也就完成了类的定义。

当我们B m_B()时,由于m_B()意思是调用了类B默认的构造函数,完成类的定义。

类的定义与类的声明区别就在于定义时是自动调用了构造函数,因此才真正创建一个对象m_B,而声明并没有调用构造函数,所以也没有创建对象,只是声明而已。

 

问:成员变量有哪些访问方式(或者访问控制方式)?

答:成员变量根据访问权限有privateprotectpublic 3种访问方式。

 

问:C++中的private的成员变量可以由哪些函数访问?

答:private只能由本类中的成员函数或者友元函数来访问。

展开阅读全文

没有更多推荐了,返回首页