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。


目录
相关文章
|
26天前
|
存储 算法 C++
C/C++工程师面试题(STL篇)
C/C++工程师面试题(STL篇)
45 6
|
26天前
|
存储 缓存 数据库
C/C++工程师面试题(数据库篇)
C/C++工程师面试题(数据库篇)
47 9
|
2月前
|
算法 测试技术 数据处理
【C/C++ 面试技巧】如何在简单的项目里突出自己的价值?
【C/C++ 面试技巧】如何在简单的项目里突出自己的价值?
51 1
|
2月前
|
安全 JavaScript 前端开发
C/C++面试题:如何理解多态?
C/C++面试题:如何理解多态?
25 0
|
2月前
|
编译器 C++ Python
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
36 1
|
3月前
|
C++
C/C++工程师面试题(指针篇)
C/C++工程师面试题(指针篇)
53 0
|
3月前
|
网络协议 网络性能优化 C++
C/C++工程师面试题(网络编程篇)
C/C++工程师面试题(网络编程篇)
48 0
|
22天前
|
算法 搜索推荐 C++
浅谈sort函数底层(一道c++面试的天坑题)
浅谈sort函数底层(一道c++面试的天坑题)
|
1月前
|
存储 算法 C++
C++容器STL相关面试问题
C++容器STL相关面试问题
|
2月前
|
敏捷开发 安全 API
C/C++ 工程师面试:如何精彩展示你的项目经验并获得高分
C/C++ 工程师面试:如何精彩展示你的项目经验并获得高分
79 0