自描述C++部分面试题集

栏目: IT技术 · 发布时间: 3年前

1、谈谈啥叫对象成员以及对象成员的构造函数调用调用方式。

在类中定义的数据成员一般都是基本的数据类型。但是类中的成员也可以是对象,叫做对象成员。

C++中对对象的初始化时非常重要的操作,当创建一个对象的适合,C++编译器必须确保调用了所有子对象的构造函数。如果所有的子对象有默认构造函数,编译器可以自动调用他们。但是如果子对象没有默认的构造函数,或者想指定调用某个构造函数怎么办?

那么是福哦可以在类的构造函数直接调用子类的属性完成初始化呢,但是如果子类的成员属性时私有的,我们是没有办法访问并完成初始化。

解决方法,对于子类调用构造函数,C++为此提供了专门的语法,即构造函数初始化列表,就当调用构造函数时,首先按各对象在类定义中的顺序(和参数泪飙的顺序无关)依次调用它们的构造函数,对这些对象初始化,最后再调用本身的函数体。也就是说,先调用对象成员的构造函数,再调用本身的构造函数,析构函数和构造函数调用顺序相反,先构造,后析构。

2、谈谈对explicit的理解

C++提供了关键字explicit,禁止通过构造函数进行的隐式转换,声明explicit的构造函数不能在饮食隐式转换中使用。

3、谈谈C中malloc free 与C++中的new delete有啥区别,或则C++在堆区申请对象时为啥推荐使用new delete

C++中的malloc free的问题:

1、 程序员 必须确定对象的长度。

2、malloc 返回一个void指针,C++不允许将void赋值给其他任何指针,必须强转。

3、malloc 可能申请内存失败,所以必须判断返回值来确保内存分配成功。

4、用户在使用对象之前必须记住对他初始化,构造函数不能显示调用初始化(构造函数是由编译器调用),用户有可能忘记调用初始化。

总结:C的动态内存分配函数太复杂,容易令人混淆,是不可接受的,C++中我们推荐使用运算符new 和 delete

new 操作符 能确定在调用构造函数初始化之前内存分配时成功的,所有不用显示确定调用是否成功。

delete表达式先调用析构函数,然后释放内存。

4、谈谈你对static静态 成员变量 的理解。

在一个类中,若将一个对象变量声明为tatic,这种成员成为静态成员变量。与一般的数据成员不同,无论建立了多少个变量,都只有一个静态数据的拷贝,静态成员变量属于某个类,所有对象共享。

静态变量,时在编译阶段就分配空间,对象还没有创建时,就已经分配空间.

注意:1、静态成员 变量必须在类中声明,在类外定义。2、静态数据成员不属于某个对象,在得对象分配空间中不包括偶静态成员所占空间。3、静态数据成员可以通过类名或者对象名来引用。

5、谈谈你对static静态 成员函数 的理解

在类定义中,前面有static说明的成员函数成为静态恒源函数,静态成员函数使用方式和静态静态变量一样,同样在对象没有创建前,即可通过类名调用。静态成员函数主要为了访问静态变量,但是,不能访问普通成员变量。

静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完全对静态数据成员的封装/

1\静态成员函数只能访问静态变量,不能访问普通成员变量,2、静态成员函数的使用和静态成员变量一样。3、静态成员函数也有访问权限。4、普通成员函数可访问静态成员变量、也可以访问非静态成员变量。

6、谈谈你对this的理解。

成员函数通过this指针即可知道操作的是那个对象的数据,This指针是一种隐含指针,,它隐含于每个类的非静态成员函数中,This指针无需定义,直接使用即可。

注意:静态成员函数内部没有this指针,静态成员函数不能操作非静态成员变量。

7、谈谈你对友元的理解

类的主要特点之一是数据因此,即类的室友成员无法在类的外部(作用域之外)访问,但是,有适合需要在类的外部访问类的私有成员,怎么办?解决方法是使用友元函数,友元函数是一种特权函数,C++允许这个特权函数访问私有成员。

1、friend关键字只出现在声明处。2、其他类、类成员函数、全局函数都可声明为友元。3、友元函数不是类的成员,不带this指针。4、友元函数可访问对象任意成员属性,包括私有属性。

友元注意事项:

1、友元关系不能被继承。2、友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友。

3、友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友。

8、谈谈你对继承的理解

C++最重要的特征是代码重用,通过继承机制可以利用已有的数据类型来定义新的数据类型,新的类不仅拥有旧类的成员,还拥有新定义的成员。

9、谈谈继承中的钩爪与析构的顺序

1、子类对象在创建时会首先调用父类的构造函数。2、父类构造函数执行完毕后,才会调用子类的构造函数。

3、当父类构造函数有参数时,需要在子类初始化列表(参数列表)中显示调用父类构造函数,析构函数调用顺序和构造函数相反。

10、继承中同名成员的处理方法

1、当子类成员和父类成员同名时,子类依然从父类继承同名成员。2、如果子类有成员和父类同名,子类访问其成员默认访问子类的成员(本作用域,就近原则)3、在子类通过作用域::进行同名成员区分(在派生类中使用基类的同名成员,显示使用类名限定符)。

11、C++的动态捆绑机制是怎样的

首先,我们看看编译器如何处理虚函数,当编译器发现我们的类中有虚函数的时候,编译器会创建一张虚函数表,把虚函数的函数入口地址放到虚函数中,并且在类中秘密增加一个指针,这个指针就是vpointer(缩写vptr),这个指针是指向对象的虚函数表。在多态调用的时候,根据vptr指针,找到虚函数表来实现动态绑定。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

离心力:互联网历史与数字化未来

离心力:互联网历史与数字化未来

[英] 乔尼·赖安(Johnny Ryan) / 段铁铮 / 译言·东西文库/电子工业出版社 / 2018-2-1 / 68.00元

★一部详实、严谨的互联网史著作; ★哈佛、斯坦福等高校学生必读书目; ★《互联网的未来》作者乔纳森·L. 齐特雷恩,《独立报》《爱尔兰时报》等知名作者和国外媒体联合推荐。 【内容简介】 虽然互联网从诞生至今,不过是五六十年,但我们已然有必要整理其丰富的历史。未来的数字世界不仅取决于我 们的设想,也取决于它的发展历程,以及互联网伟大先驱们的理想和信念。 本书作者乔尼· ......一起来看看 《离心力:互联网历史与数字化未来》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具