C++面试题二

1、在C++程序中调用被C编译器编译后的函数,为什么要加 extern "C"?

答案:C语言不支持函数重载,C++ 提供了C连接交换制定符号extern "C"解决名字匹配问题。

2、如何判断一段程序是由C编译程序还是由C++编译程序编译的?

答案:C++编译时定义了_cplusplus。C编译时定义了_STDC_。

3、main主函数执行完毕后,是否可能会再执行一段代码?给出说明。

答案:如果需要加入一段在main退出后执行的代码,可以使用atexit()函数注册一个函数,代码为:int atexit(void (*funciton)(void));

4、用预处理指令#define声明一个常数,用以表明一年中有多少秒(忽略闰年问题)。

答案:#defineSECONDS_PER_YEAR (60*60*24*365)UL   注意括号,同时不能用分号,不要写出计算出来的实际值,用到无符号长整型。

5、const与#define有什么区别?

答案:两者都可以定义常量。1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行安全检查,而对后者只进行字符替换,没有类型安全检查;2)有些集成化调试工具可以对const进行调试,不能对宏常量进行调试。const在C中其实是值不能修改的变量,因此会给它分配存储空间(默认是外部连接的),在C++中对于基本数据类型的常量,编译器会把它放到符号表里而不是分配存储空间(默认是内部连接的,若强制声明为extern,则需要分配存储空间)。

const
int bufsize = 100;    //在C++中注意此处int一定不可少,因为c++中不支持默认int型

char buf[bufsize];      //在C++中这样写没问题

const bufsize;  //在C中这样写没问题,但是在C++中是有错误的。

//要做同样的事情,C++需改强制声明为extern:externconst bufsize;

6、写一个标准宏MIN,输入两个参数返回最小值。

答案:#define  MIN(A,B) ((A)<=(B)?(A):(B))

7、内存中的数据对齐问题,举例说明。

答案:数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍。DWORD数据的内存起始能被4除尽,WORD数据的内存地址能被2除尽。X86 CPU能直接访问对齐的数据,当它试图访问一个未对齐的数据时,会在内部进行一系列的调整,这些调整会降低运行速度。在默认情况下,为了方便对结构体内元素的访问和管理,当结构体的元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是,结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位,但是结构体内相同连续元素在连续的空间内,和数组一样。比如:

struct{

short a1;  //sizeof(short) =2

short a2;

short a3;

}A;   //以最长元素的为对齐单位,sizeof(A)=2+2+2=6

struct{

long a1; //sizeof(long) = 4

short a2;

}B;    //以最长元素为对齐单位,即为的整数倍,sizeof(B) = 4+2+补齐两位= 8

class A{

public:

int a;

char c;

static
int c;

};  //sizeof(A) = 8,注意:数据对齐,同时静态变量是存放在全局数据区的,sizeof只计算栈中分配的大小。

struct C{

};     //空的结构体空间为1字节sizeof(C) = 1

class A{

};     //空类的空间为1字节 sizeof(A) = 1

8、说明sizeof和strlen之间的区别。

答案:1)sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsigned int类型;

2)sizeof是运算符,strlen是函数;

3)sizeof可以用类型作参数,还可以用函数作参数(相当于以函数返回值类型作参数);strlen只能用char*做参数,且必须是以"\0"结尾的;

4)数组做sizeof的参数不退化,传递给strlen就退化为指针;

5)sizeof是在编译的时候计算的,strlen是在运行的时候才计算的;

6)sizeof后如果是类型必须加括号,如果是变量名可以不加括号;

7)当使用了一个结构类型或是变量时,sizeof返回实际的大小。当使用一静态的空间数组时,sizeof返回全部数组的大小。sizeof不能返回被动态分配的数组或外部数组的大小;

8)sizeof操作符不能用于函数类型、不完全类型或位字段;

char str[20] = "0123456789";

int a = strlen(str);   //a = 10

int b = sizeof(str);   //b = 20

char a[7] ="a0\0a0\0";      //strlen(a) =2, sizeof(a) = 7

printf("len = %d\tsizeof = %d\n",strlen(a),sizeof(a));

class A{

public:

int a;

staticint b;

A();

~A();

};   //sizeof(A) = 4,因为静态变量存储在全局数据区,而sizeof计算栈中分配的大小。

8、一个空类占多少空间?多重继承的空类呢?

答案:一个空类所占空间为1,多重继承的空类所占空间还是1.但是如果是虚继承的话,因为涉及到虚函数表(虚指针),所以其所占空间为4.

9、指针和引用的区别?

答案:1)非空区别。指针可以为空,引用不能为空。

2)合法性区别。只用引用之前不要测试它的合法性,而指针则应该总是被测试,防止其为空。

3)可修改。指针可以被重新赋值以指向另一个不同的对象,但是引用则总是指向在初始化时被指定的对象。

4)应用区别。在以下情况下应该使用指针:一是考虑到存在不指向任何对象的可能(这种情况下能够设指针为空),二是需要能够在不同的时刻指向不同的对象(这种情况能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么应该使用引用。

10、说明"this"指针的特点?

答案:1)this只能在成员函数中使用,全局函数和静态函数都不能使用this,只有在成员函数里才有this指针的位置;

2)this在成员函数的开始前构造,在成员的结束后清除;

3)This指针会因编译器不同而有不同的存放位置,可能是栈,也可能是寄存器或者全局变量;

4)大多数编译器通过ecx寄存器传递this指针,在call之前,编译器会把对应的对象地址放到eax中。This是通过函数的首参数来传递的;

5)普通的类函数都不会创建一个函数表来保存函数指针,只有虚函数才会被放到函数表中。

时间: 2024-12-21 17:37:26

C++面试题二的相关文章

某支付公司笔试题二

题目:用java编写一段程序采用选择排序法对数组array = {25,15,42,16,12,36}进行由小到大排序. 1.选择排序法 该排序法的思想是每次从当前元素开始往后查找最小元素,将最小与当前元素进行位置互换.选择排序和冒泡排序相比优势在于交换次数减少. // 时间复杂度n(n-1)/2,即O(n^2) public static void selectSort(int[] array){ int k,tmp,len; len=array.length; for(int i=0;i<l

菜鸟系列之C/C++经典试题(二)

求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4,7, 2,因此输出为该子数组的和18. 这个问题在各大公司面试中出现频率之频繁,被人引用次数之多,非一般面试题可与之匹敌.ok,下面,咱们来一步一步分析这个题. 分析与解法 解法一 求一个数组的最大子数组和

C++经典面试题(二)

最近看一些面试题,觉得如果自己被问到了,并不能很利落的回答出来. 一是从来没有这个意识,二是没有认真的梳理下. 下面对这些题做出分析,哈!个人能力有限,其中难免有疏漏,欢迎大家补充咯! 11.引用与指针有什么区别? [参考答案] 1) 引用必须被初始化,指针不必. 2) 引用初始化以后不能被改变,指针可以改变所指的对象. 3) 不存在指向空值的引用,但是存在指向空值的指针. 可以参考下 在 5 题中补充的内容 12.C++中virtual与inline的含义分别是什么? [参考答案] 在基类成员

Java面试题(二)

系统整理了一下有关Java的面试题,包括基础篇,javaweb篇,框架篇,数据库篇,多线程篇,并发篇,算法篇等等,陆续更新中.其他方面如前端后端等等的面试题也在整理中,都会有的. 注:文末有福利! 1.String s = new String("xyz");创建了几个StringObject?是否可以继承String类? 两个或一个都有可能,"xyz"对应一个对象,这个对象放在字符串常量缓冲区,常量"xyz"不管出现多少遍,都是缓冲区中的那一个

Java常考面试题(二)(转)

序言 昨天刚开始的"每日5题面试"这类文章,感觉还不错,把一些平常看似懂了的东西,弄清楚了.就像什么是虚拟机?这个问题,看起来知道,但是要说出个所以然来,又懵逼了,经常回过头来看看做过的 面试题,试着用自己的话说出来,看会不会,不会的话就继续看看,理解理解. ------WZY 一.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思? 自己解答: 覆盖:又称作重写, 前提条件:继承.   子类将父类中的某个方法,原封不动的抄下来,方法体中就自己写

几个让我印象深刻的面试题(二)

前言 原文地址&&我的博客知乎&&知乎专栏简书河南前端交流群官网 上次写了一篇几个让我印象深刻的面试题(一)没看过的同学可以去看哦.这次文章的题目来源:这里有超过20家的前端面试题,你确定不点进来看看?.如果上面的问题在我这篇文章里没有提到的话,那就说明有些问题可以很容易查得到或者很简单或者我能力有限不能解答出来的.如果有的问题你不会而且我又没有提的那就认为就是我能力有限不能解答出来吧.嘿嘿嘿.开个玩笑,不过可以在下面留言哦! 正文 还是老规矩先给题目,然后在看我的答案,有

【面试】iOS 开发面试题(二)

1. 我们说的oc是动态运行时语言是什么意思? 答案:多态. 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和多态. 简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法. 多态:不同对象以自己的方式响应相同的消息的能力叫做多态.意思就是假设生物类(life)都用有一个相同的方法-eat; 那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法. 也就是不同的对象以自己的

web前端整套面试题(二)--今日头条面试题

12道单选,7道不定项选择,2道编程题 一.单选(12题) 1.[单选题]在HTML中,( )可以在网页上通过链接直接打开邮件客户端发送邮件. A.<a href=”telnet:[email protected]”>发送邮件</a> B.<a href=”mail:[email protected]”>发送邮件</a> C.<a href=”mailto:[email protected]”>发送邮件</a> D.<a hre

PHP面试题二

1.抓取远程图片到本地,你会用什么函数? fsockopen, A 2.用最少的代码写一个求3值最大值的函数. function($a,$b,$c){* W0 z* u6 k+ e. L  a: }5 }    return $a>$b? ($a>$c? $a : $c) : ($b>$c? $b  :  $c );5 O: F6 v1 W# U} 3.用PHP打印出前一天的时间,打印格式是2007年5月10日22:21:21 Echo date('Y-m-d H:i:s',strtot