`
SunnyYoona
  • 浏览: 364966 次
社区版块
存档分类
最新评论

C++面试若干问题

 
阅读更多

题目(1)

定义一个空类型,里面没有任何成员变量和成员函数,对该类型求sizeof,得到结果是()

A、 0 B、 1 C、 4 D、8

【解析】B

空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例,至于占用多少内存,

由编译器决定,Visual Studio中每个空类型的实例占用1个字节的空间。

#include <iostream>
using namespace std;

// 空类
class Fruits
{

};

// 继承空类的空类
class Apple : public Fruits
{

};

// 空结构体
struct Sports
{

};

// 主函数
int main(int argc, char **argv)
{
	cout<<"sizeof(Fruits):"<<sizeof(Fruits)<<endl;
	cout<<"sizeof(Apple):"<<sizeof(Apple)<<endl;
	cout<<"sizeof(Sports):"<<sizeof(Sports)<<endl;
	return 0;
}



题目(2)

如果在该类型中添加一个构造函数和析构函数,在对该类型求sizeof,得到的结果是()

A、 0 B、 1 C、 4 D、8

【解析】B

调用构造函数和析构函数只需要知道函数的地址即可,而这些函数的地址只与类型有关,而与类型的实例无关,编译器也不会因为这两个函数而在实例内添加额外的信息。


题目(3)

如果把析构函数标记为虚函数呢?
【解析】
c++编译器一旦发现一个类型中有虚拟函数,就会为该类型生成虚拟函数表,并且在该类型的每一个实例中添加一个指向虚函数表的指针。
在32位机器上,一个指针占4个字节的空间,因此求sizeof得到4;如果在64位机器上,一个指针占8字节的空间,因此求sizeof则得到8

题目(4)

下面是C++语言中两种if语句判断方式。请问哪种写法更好?为什么?

// 主函数
int main()
{
	int n;
	// 第一种判断方式
	if(n == 10) 
	{
	}
	// 第二种判断方式
	if(10 == n) 
	{
	}
	return 0;
}

【解析】第二种

第二种方法如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了=

第一种不会报错 会变为赋值语句

来源:剑指Offer(何海涛)

题目(5)

32位环境下,int *p=new int[10];请问sizeof(p)的值为()

A、4 B、10 C、40 D、8

【解析】A

指针就是一个地址值,在32位系统下,占用4个字节,
用sizeof求枚举类型的长度,等于一个int型的长度,而与有几个枚举值无关.所以a也是占4个字节

来源:2014迅雷校园招聘


题目(6)

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

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

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

来源:剑指Offer(何海涛)


题目(7)

#include<stdio.h>
#include<string.h>

int main()
{   
	char str1[] = "I love you";
	char str2[] = "I love you";
	char* str3 = "I love you";
	char* str4 = "I love you";
	if(str1 == str2){
		printf("str1 and str2 are same.\n");
	}
	else{
		printf("str1 and str2 are not same.\n");
	}

	if(str3 == str4){
		printf("str3 and str4 are same.\n");
	}
	else{
		printf("str3 and str4 are not same.\n");
	}

	if(strcmp(str1,str2) == 0){
		printf("the value of str1 and str2 are same.\n");
	}
	else{
		printf("the value of str1 and str2 are not same.\n");
	}
    return 0;
}

【解析】


c/c++把敞亮字符串放到一个单独的一个内存区域。当几个指针赋值给相同的敞亮字符串时,他们实际上会指向相同的内存地址。但常量内存初始化数组,情况却不一样。

str1和str2是两个字符串数组,我们会为他分配两个长度为12个字节的空间,并把“I love you”的内容分别复制到数组中去。这是两个初始化地址不同的数组。所以str1和str2是不相同的。

str3和str4是两个指针,我们无需为他们分配内存以存储字符串的内容,只需要把他们指向“I love you”在内存中的地址就可以了。由于内容是常量字符串,他在内存中只有一个拷贝,因此他们指向的是同一个地址。所以str3和str4是相同的。

strcmp()只是判断字符串中的内容(值)是不是一样。


题目(8)变量的声明与定义


变量的声明和定义有什么区别

【解析】
为变量分配地址和存储空间的称为定义,不分配地址的称为声明。

一个变量可以在多个地方声明,但是只在一个地方定义。

加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。

说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。


题目(9)sizeof与strlen

请说明sizeof 和 strlen 的区别

【解析】

sizeof 和 strlen 有以下区别:

 sizeof 是一个操作符,strlen 是库函数。

 sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为‘\ 0‘的字符串作参数。

 编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且 sizeof计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。

 数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。

注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定

要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就是 sizeof。


分享到:
评论

相关推荐

    c.c++找工作面试重点结构图-mindmanager

    c.c++找工作面试重点结构图-mindmanager 13字符串 13.1字符串字面量 13.2字符串变量 13.3字符串的读写 13.4访问字符串中的字符 13.5C语言的字符库 13.6字符串惯用法 13.7字符串数组 ......... 17指针的高级...

    c++笔试面试宝典2009版

    c++中若干 难以理解的问题 及 面试易被问道的问题!!

    c++ 面试题 总结

    C++面试题 1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。 private 也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的...

    c++面试经典算法

    3、编写一个学生类,成员...10、有若干教师,每个教师只有姓名,一个教师可以指导多名研究生;每名研究生有姓名、研究方向和班号数据,编写一个程序,要求输出每个教师指导的所有研究生的姓名、研究方向和班号数据。

    程序员面试金典pdf02

    150个编程题问答从二叉树到二分查找,该部分涵盖了关于数据结构和算法的最常见、最有用的...面试准备的若干策略不要因为沉溺在无穷无尽的面试题中而错过了最重要的求职建议。这些策略和步骤可以让你更有效地准备面试

    IBM面试题 面试中的宝典

    第一组  1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?

    华为笔试面试题集(C/C++)

    int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至 数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率...

    C++/C基本编程技能

    包含若干比较经典的编程试题,对面试有所帮助。

    C++中求旋转数组中的最小数字(经典面试题)

    面试题:旋转数组的最小数字 题目:把一个数组的最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增数组的旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组...

    fengmin0722#algorithms-1#面试题58 - II. 左旋转字符串1

    面试题58 - II. 左旋转字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋

    fengmin0722#algorithms-1#面试题11. 旋转数组的最小数字1

    面试题11. 旋转数组的最小数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5]

    写函数计算4个测验分数的平均数

    写函数计算4个测验分数的平均数,和标准差。标准差等于4个值的平均值的平方根

    java面试题

    答:折构函数式销毁一个类的函数,虚函数是为了C++的动态绑定而设计的。 描述你的编程风格? 答:类名首字母大写,常量一般全部大写,给自己的代码加注释。 控制流程? 答:控制流程一般使用if判断条件。有第二分支...

    corejava基础重要知识点总结

    面向过程:需要人站在计算机的角度去思考问题 面向对象:需要人拿着代码模拟实现生活 类:一组类型相同事物高度抽象之后的集合概念 创建对象的模板 -》 class 对象:类的一个具体的实例 例子: 人和范冰冰...

Global site tag (gtag.js) - Google Analytics