C++面试题二

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++面试题二相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

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

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

5const#define有什么区别?

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

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

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

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

               //要做同样的事情,C++需改强制声明为externexternconst 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、说明sizeofstrlen之间的区别。

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

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

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

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

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

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

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

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

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"指针的特点?

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

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

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

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

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

以上是关于C++面试题二的主要内容,如果未能解决你的问题,请参考以下文章

C# 面试题二

C++面试题汇总

Linux基础面试题二

python(面试题二)

python面试题二:Python 基础题

PHP面试题二