写在前面的话:本次选用的5道题,是我微博(http://weibo.com/zhedahht和http://t.163.com/zhedahht)中#面试每日一题#系列的第11题到第15题。有合适的题目,我会继续收集C/C++/C#的面试题,并不定期发表到博客和大家分享。

题目(11):运行下图中的C#代码,输出是什么?

namespace StringValueOrReference
{class Program{internal static void ValueOrReference(Type type){String result = "The type " + type.Name;if (type.IsValueType)Console.WriteLine(result + " is a value type.");elseConsole.WriteLine(result + " is a reference type.");}internal static void ModifyString(String text){text = "world";}static void Main(string[] args){String text = "hello";ValueOrReference(text.GetType());ModifyString(text);Console.WriteLine(text);}}
}

答案:输出两行。第一行是The type String is reference type. 第二行是hello。类型String的定义是public sealed class String {...},既然是class,那么String就是引用类型。

在方法ModifyString里,对text赋值一个新的字符串,此时改变的不是原来text的内容,而是把text指向一个新的字符串"world"。由于参数text没有加ref或者out,出了方法之后,text还是指向原来的字符串,因此输出仍然是"hello".

题目(12):运行下图中的C++代码,输出是什么?

#include <iostream>class A
{
private:int n1;int n2;
public:A(): n2(0), n1(n2 + 2){}void Print(){std::cout << "n1: " << n1 << ", n2: " << n2 << std::endl;}
};int _tmain(int argc, _TCHAR* argv[])
{A a;a.Print();return 0;
}

答案:输出n1是一个随机的数字,n2为0。在C++中,成员变量的初始化顺序与变量在类型中的申明顺序相同,而与它们在构造函数的初始化列表中的顺序无关。因此在这道题中,会首先初始化n1,而初始n1的参数n2还没有初始化,是一个随机值,因此n1就是一个随机值。初始化n2时,根据参数0对其初始化,故n2=0。

题目(13):编译运行下图中的C++代码,结果是什么?(A)编译错误;(B)编译成功,运行时程序崩溃;(C)编译运行正常,输出10。请选择正确答案并分析原因。

#include <iostream>class A
{
private:int value;public:A(int n){value = n;}A(A other){value = other.value;}void Print(){std::cout << value << std::endl;}
};int _tmain(int argc, _TCHAR* argv[])
{A a = 10;A b = a;b.Print();return 0;
}

答案:编译错误。在复制构造函数中传入的参数是A的一个实例。由于是传值,把形参拷贝到实参会调用复制构造函数。因此如果允许复制构造函数传值,那么会形成永无休止的递归并造成栈溢出。因此C++的标准不允许复制构造函数传值参数,而必须是传引用或者常量引用。在Visual Studio和GCC中,都将编译出错。

题目(14):运行下图中的C++代码,输出是什么?

int SizeOf(char pString[])
{return sizeof(pString);
}int _tmain(int argc, _TCHAR* argv[])
{char* pString1 = "google";int size1 = sizeof(pString1);int size2 = sizeof(*pString1);char pString2[100] = "google";int size3 = sizeof(pString2);int size4 = SizeOf(pString2);printf("%d, %d, %d, %d", size1, size2, size3, size4);return 0;
}

答案:4, 1, 100, 4。pString1是一个指针。在32位机器上,任意指针都占4个字节的空间。*pString1是字符串pString1的第一个字符。一个字符占一个字节。pString2是一个数组,sizeof(pString2)是求数组的大小。这个数组包含100个字符,因此大小是100个字节。而在函数SizeOf中,虽然传入的参数是一个字符数组,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针。因此size4也是一个指针的大小,为4.

题目(15):运行下图中代码,输出的结果是什么?这段代码有什么问题?

#include <iostream>class A
{
public:A(){std::cout << "A is created." << std::endl;}~A(){std::cout << "A is deleted." << std::endl;}
};class B : public A
{
public:B(){std::cout << "B is created." << std::endl;}~B(){std::cout << "B is deleted." << std::endl;}
};int _tmain(int argc, _TCHAR* argv[])
{A* pA = new B();delete pA;return 0;
}

答案:输出三行,分别是:A is created. B is created. A is deleted。用new创建B时,回调用B的构造函数。在调用B的构造函数的时候,会先调用A的构造函数。因此先输出A is created. B is created.

接下来运行delete语句时,会调用析构函数。由于pA被声明成类型A的指针,同时基类A的析构函数没有标上virtual,因此只有A的析构函数被调用到,而不会调用B的析构函数。

由于pA实际上是指向一个B的实例的指针,但在析构的时候只调用了基类A的析构函数,却没有调用B的析构函数。这就是一个问题。如果在类型B中创建了一些资源,比如文件句柄、内存等,在这种情况下都得不到释放,从而导致资源泄漏。

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

程序员面试题精选100题(54)-C++/C#面试题(3)相关推荐

  1. 程序员面试题精选100题(53)-C++/C#面试题(2)

    写在前面的话:本次选用的5道题,是我微博(http://weibo.com/zhedahht和http://t.163.com/zhedahht)中#面试每日一题#系列的第6题到第10题.有合适的题目 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 2019ug最新版本是多少_NX1847:2019年最新版本,从某种意义上来说,也将是终极版本...
  2. WEB接口测试之Jmeter接口测试自动化 (一)(初次接触)
  3. 五分钟没有操作自动退出_智阅云自动阅读器app下载-智阅云自动阅读器app安卓版下载v1.0...
  4. ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' 解决Mysql错误
  5. 使用JFace Viewer延迟获取模型元素
  6. IDEA autowired校验关闭方法
  7. GIT提交记录和Revert commit过程分析
  8. 【TI-ONE系列教程(二)】如何使用 TI-ONE 平台内置算子玩转算法大赛
  9. hdu 1312深搜入门题
  10. 1.TCP/IP 详解卷1 --- 概述
  11. 4. DICOM图像层级分类-DCMTK-元素读取
  12. 钉钉isv接入三方应用授权鉴权流程
  13. 金多多点评上塘路包揽大金融
  14. 【转】SSL协议、SET协议、HTTPS简介
  15. 中联通首次确定3G上网资费 限流量包月150元
  16. 静态网站(博客)生成器Static Site Generators(SSGs)大集合
  17. oracle查询远程视图进行insert语句报错:ORA-00600: 错误 [qerrmOFBu1], [24347], []
  18. 如何解决服务器延迟高的问题?
  19. php和mhp,移动蜜罐MHP 的设计和实现
  20. 雷达感应模组,自动播放讲解仪雷达应用,雷达传感器技术

热门文章

  1. 各种NLP操作难实现?谷歌开源序列建模框架Lingvo
  2. 从变量到封装:一文带你为机器学习打下坚实的Python基础 By 机器之心2017年10月13日 10:43 本文整体梳理了 Python 的基本语法与使用方法,并重点介绍了对机器学习十分重要的且常
  3. Visual Studio 2013开发 mini-filter driver step by step (5) - 读写文件
  4. Java开发规范01 - 集合篇_Arrays.asList 坑
  5. 实战SSM_O2O商铺_15【商铺注册】View层+Controller层之图片上传
  6. Oracle实例迁移_真实场景实操
  7. 计算机网掉了,非常急电脑掉网我电脑上上网就会自己掉网不显示网络断开但一切有关上 爱问知识人...
  8. 用python画奥迪标志_不知道不 OK!53 个 Python 经典面试题详解
  9. 0362计算机应用基础在线考试,0362《计算机应用基础》(本科)2017年6月期末考试指导.doc...
  10. 系统优化怎么做-SQL优化