C++面试若干问题

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

题目(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。


目录
相关文章
|
6月前
|
存储 缓存 数据库
C/C++工程师面试题(数据库篇)
C/C++工程师面试题(数据库篇)
114 9
|
6月前
|
存储 算法 C++
C/C++工程师面试题(STL篇)
C/C++工程师面试题(STL篇)
135 6
|
6月前
|
C++
二叉树进阶面试题(精华总结)【C++版本】
二叉树进阶面试题(精华总结)【C++版本】
|
6月前
|
算法 测试技术 数据处理
【C/C++ 面试技巧】如何在简单的项目里突出自己的价值?
【C/C++ 面试技巧】如何在简单的项目里突出自己的价值?
174 1
|
5月前
|
存储 算法 编译器
C++面试题其一
C++文件编译与执行的四个阶段 预处理:处理#include、#define等预处理指令。 编译:将源码翻译为目标代码。 汇编:将目标代码转换为机器指令。 链接:将目标文件和库文件合并生成可执行文件。 STL中的vector的实现,是怎么扩容的? vector通过动态数组实现,当容量不足时,分配更大的内存(通常是原来的两倍),复制旧数据到新内存,并释放旧内存。
84 2
|
5月前
|
存储 程序员 编译器
C++面试题其二
extern "C" 用于告诉编译器按照C语言的链接方式处理代码,通常用于C++代码与C代码混合编程,以防止因名字修饰(name mangling)引起的链接错误。例如: extern "C" { void c_function(); } 通过这些问题的深入理解和解答,能够更好地掌握C++编程的核心概念和实际应用,为面试做好充分的准备。
75 1
|
5月前
|
存储 网络协议 编译器
【干货总结】Linux C/C++面试知识点
Linux C/C++基础与进阶知识点,不仅用于面试,平时开发也用得上!
592 13
|
6月前
|
存储 算法 C语言
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
61 5
|
6月前
|
存储 编译器 C语言
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(下)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
60 1
|
6月前
|
存储 编译器 Linux
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(中)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
68 1