写在前面的话:由于与C++语法相关的面试题,通常用很短的篇幅就能解释清楚,不适合写博客,因此本博客一直没有关注C++的语法题。近期发现篇幅短的C++题目刚好合适微博,于是开始在微博http://weibo.com/zhedahht和http://t.163.com/zhedahht上写C++的系列面试题。感兴趣的读者可以关注我的微博,或者直接围观面试题每日一题系列。同时,我也将不定期整理一些经典的C++面试题,发表到本博客上。

题目(一):我们可以用static修饰一个类的成员函数,也可以用const修饰类的成员函数(写在函数的最后表示不能修改成员变量,不是指写在前面表示返回值为常量)。请问:能不能同时用static和const修饰类的成员函数?

分析:答案是不可以。C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时static的用法和static是冲突的。

我们也可以这样理解:两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。

题目(二):运行下面的代码,输出是什么?

class A
{
};class B
{
public:B() {}~B() {}
};class C
{
public:C() {}virtual ~C() {}
};int _tmain(int argc, _TCHAR* argv[])
{printf("%d, %d, %d\n", sizeof(A), sizeof(B), sizeof(C));return 0;
}

分析:答案是1, 1, 4。class A是一个空类型,它的实例不包含任何信息,本来求sizeof应该是0。但当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。Visual Studio 2008中每个空类型的实例占用一个byte的空间。

class B在class A的基础上添加了构造函数和析构函数。由于构造函数和析构函数的调用与类型的实例无关(调用它们只需要知道函数地址即可),在它的实例中不需要增加任何信息。所以sizeof(B)和sizeof(A)一样,在Visual Studio 2008中都是1。

class C在class B的基础上把析构函数标注为虚拟函数。C++的编译器一旦发现一个类型中有虚拟函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。在32位的机器上,一个指针占4个字节的空间,因此sizeof(C)是4。

题目(三):运行下面中的代码,得到的结果是什么?

class A
{
private:int m_value;public:A(int value){m_value = value;}void Print1(){printf("hello world");}void Print2(){printf("%d", m_value);}
};int _tmain(int argc, _TCHAR* argv[])
{A* pA = NULL;pA->Print1();pA->Print2();return 0;
}

分析:答案是Print1调用正常,打印出hello world,但运行至Print2时,程序崩溃。调用Print1时,并不需要pA的地址,因为Print1的函数地址是固定的。编译器会给Print1传入一个this指针,该指针为NULL,但在Print1中该this指针并没有用到。只要程序运行时没有访问不该访问的内存就不会出错,因此运行正常。在运行print2时,需要this指针才能得到m_value的值。由于此时this指针为NULL,因此程序崩溃了。

题目(四):运行下面中的代码,得到的结果是什么?

class A
{
private:int m_value;public:A(int value){m_value = value;}void Print1(){printf("hello world");}virtual void Print2(){printf("hello world");}
};int _tmain(int argc, _TCHAR* argv[])
{A* pA = NULL;pA->Print1();pA->Print2();return 0;
}

分析:答案是Print1调用正常,打印出hello world,但运行至Print2时,程序崩溃。Print1的调用情况和上面的题目一样,不在赘述。由于Print2是虚函数。C++调用虚函数的时候,要根据实例(即this指针指向的实例)中虚函数表指针得到虚函数表,再从虚函数表中找到函数的地址。由于这一步需要访问实例的地址(即this指针),而此时this指针为空指针,因此导致内存访问出错。

题目(五):静态成员函数能不能同时也是虚函数?

分析:答案是不能。调用静态成员函数不要实例。但调用虚函数需要从一个实例中指向虚函数表的指针以得到函数的地址,因此调用虚函数需要一个实例。两者相互矛盾。

博主何海涛对本博客文章享有版权。网络转载请注明出处http://zhedahht.blog.163.com/。整理出版物请和作者联系。

程序员面试题精选100题(52)-C++面试题(1)相关推荐

  1. 程序员面试题精选100题

    程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树   ...

  2. [程序员面试题精选100题]13.第一个只出现一次的字符

    [题目] 在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b. [分析] [代码] /********************************* * 日期:2013- ...

  3. 程序员面试题精选100题(51)-顺时针打印矩阵

    // 程序员面试题精选100题(51)-顺时针打印矩阵.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostre ...

  4. 程序员面试题精选100题:求从1到n的正数中1出现的次数

    // 程序员面试题精选100题(25):求从1到n的正数中1出现的次数 // 如 f(253) = (2!=0) * 100 + 2 * f(99) + (5!=0) * 10 + 5 * f(9) ...

  5. 程序员面试题精选100题:41-50解题报告

    程序员面试题精选100题(41)-把数组排成最小的数[算法]   题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{32,  321},则输出这两个能 ...

  6. 程序员面试题精选100题:11-40解题报告

    程序员面试题精选100题(11)-求二元查找树的镜像[数据结构]   题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点.用递归和循环两种方法完成 ...

  7. [程序员面试题精选100题]19.反转链表

    题目 输入一个链表的头结点,反转该链表,并返回反转后链表的头结点. 分析 假设经过若干操作,我们已经把结点 pre之前的指针调整完毕,这些结点的next指针都指向前面一个结点.现在我们遍历到结点cur ...

  8. 程序员面试题精选100题(19)-反转链表[数据结构]

    题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点.链表结点定义如下: struct ListNode {int m_nKey;ListNode* m_pNext; }; 分析:这是一道 ...

  9. 程序员面试题精选100题(17)-把字符串转换成整数[算法]

    题目:输入一个表示整数的字符串,把该字符串转换成整数并输出.例如输入字符串"345",则输出整数345. 分析:这道题尽管不是很难,学过C/C++语言一般都能实现基本功能,但不同程 ...

最新文章

  1. ISME:中大李文均组在放线菌生命暗物质的生态功能与进化上取得进展
  2. 疯狂python讲义
  3. 回调函数_实用程序类与函数式编程无关
  4. python版本升级后编译_python学习笔记(7)--python版本升级
  5. MFC常用类、成员函数、数组类、Cstring类、CTime类、CPoint类
  6. freemarker的空值和默认值
  7. android launcher 相关
  8. CodeForces - 820D Mister B and PR Shifts(思维+模拟)
  9. .Net序列化与反序列化的2种方法
  10. 微服务升级_SpringCloud Alibaba工作笔记0003---理解spring webflux_响应式堆栈_提高微服务吞吐量和伸缩性
  11. 【报告分享】2020中国后浪生存图鉴.pdf(附下载链接)
  12. android人脸识别demo_C#开发实录:基于免费SDK实现人脸识别应用开发
  13. node express框架实现下载文件功能
  14. 如何解决tomcat提示文件被锁定
  15. excel游戏_Excel 20190912的娱乐和游戏
  16. 抽奖小程序可以用html写吗,jquery 抽奖小程序实现代码
  17. vtuber面部捕捉工具_Live2D纸片人出道?VTuber工具VUP了解下
  18. 人工智能 python 考证_写人作文
  19. Pr:导出设置之多路复用器与常规
  20. Python学习摘录(自用)

热门文章

  1. 这年头,老赖没得混了!大数据式追债,你见过吗?
  2. 为什么说在KMP算法中文本串中的每个字符都是需要进行比较操作的?
  3. 每日一博 - DelayQueue阻塞队列源码解读
  4. 白话Elasticsearch50-深入聚合数据分析之doc values机制
  5. 白话Elasticsearch07- 深度探秘搜索技术之基于term+bool实现的multiword搜索底层剖析
  6. Spring-AOP 自动创建代理之BeanNameAutoProxyCreator
  7. 64 oracle client,64bit oracle and oracle client.
  8. ubuntu 定时执行php文件,Ubuntu crontab 定时执行php脚本文件
  9. order by 空值排在最后_当梅根·马克尔最后一次皇室活动选择选择翡翠绿时证明她非常时髦...
  10. 4 拼接_解析,地漏与瓷砖的4种拼接方法及安装工艺