zoukankan      html  css  js  c++  java
  • 自描述C++部分面试题集

    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指针,找到虚函数表来实现动态绑定。

  • 相关阅读:
    快速构建Windows 8风格应用22MessageDialog
    快速构建Windows 8风格应用20MediaElement
    Windows Phone SDK 8.0安装步骤
    快速构建Windows 8风格应用25数据绑定
    快速构建Windows 8风格应用24App Bar构建
    快速构建Windows 8风格应用21构建简单媒体播放器
    快速构建Windows 8风格应用23App Bar概述及使用规范
    sqlyog存储过程
    201751201 输入数字输出汉字读法
    考虑算法的时间效率
  • 原文地址:https://www.cnblogs.com/loliconinvincible/p/13246932.html
Copyright © 2011-2022 走看看