C++面试题详解

      这些面试题都是自己在面试的时候遇见的,因此总结下来,在以后的面试过程中供大家和自己学习使用。其中的答案是自己通过百度或者自己写出来的,如有错误欢迎指正。

1、逆序输出字符串。

// 逆序输出字符串
char* funReverseStr(char* a)
{
	if (!a)
	{
		return NULL;
	}
	int len = strlen(a);
	char* ret = (char*)malloc(len + 1);
	int n = len - 1;
	for (int i = 0; i < len; i++)
	{
		ret[i] = a[n];
		n--;
	}
	ret[len] = '\0';
	return ret;
}

2、检测出一个字节中 二进制位1的个数。

// 检测出一个字节中 1的个数
int funCharOneLen(char a)
{
	char test[8] = {1, 2, 4, 8, 16, 32, 64, 128};
	int len = 0;
	char res = a;
	for (int i = 0; i < 8; i++)
	{
		a |= test[i];
		if (res != a)
		{
			a = res;
		}
		else
		{
			len++;
		}
	}
	return len;
}

3、如何确定一段程序是C编译程序还是C++编译程序?

// 如果包含的头文件是stdio.h
void JudgeCOrCPP1()
{
#ifdef __cplusplus
	printf("C++编译!\n");
#else
	printf("C编译!\n");
#endif // __cplusplus
}

// 如果包含的头文件是iostream
void JudgeCOrCPP2()
{
#ifdef __cplusplus
	cout << "C++编译!\n";
#else
	cout << "C编译!\n";
#endif // __cplusplus
}

4、简述Windows消息机制。

     我在网上百度了很多关于这个问题的描述,大部分都是长篇大论,根本不适合面试的时候回答。因为这个问题在笔试中和与面试官的面谈中都遇见过。所以自己简单总结了一下,如有不对或者不完善的地方或者有更好的答案,欢迎补充。

     Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。
   Windows系统中有两种消息队列:系统消息队列和应用程序消息队列。计算机的所有输入设备由Windows监控。当一个事件发生时,Windows先将输入的消息放入系统消息队列中,再将消息拷贝到相应的应用程序消息队列中。应用程序的消息处理程序将反复检测消息队列,并把检测到的每个消息发送到相应的窗口函数中。这便是一个事件从发生至到达窗口函数必须经历的过程。
   必须注意的是,消息并非是抢占性的,无论事件的缓急,总是按照到达的先后派对,依次处理(一些系统消息除外),这样可能使一些实时外部事件得不到及时处理。
   Windows中的消息是放在对应的进程的消息队列里的。可以通过GetMessage取得,并且对于一般的消息,此函数返回非零值,但是对于 WM_QUIT消息,返回零。可以通过这个特征,结束程序。当取得消息之后,应该先转换消息,再分发消息。所谓转换,就是对键盘码的转换,所谓分发,就是把消息分发给对应的窗口,由对应的窗口处理消息,这样对应窗体的消息处理函数就会被调用。两个函数可以实现这两个功能:TranslateMessage 和DispatchMessage。

5、简述模态与非模态对话框在实现原理上的区别。

     面试官问这个问题肯定是不问界面上的差异,而是底层的实现。推荐一篇文章,记得当时就是百度到的这篇,模态与非模态对话框在实现原理上的区别

6、TCP三次握手与四次挥手。

      这个推荐我写的一篇文章,面试:TCP三次握手与四次挥手看这一篇就够了!

7、简述HTTPS协议加密与解密数据的流程。

      这个推荐看一篇自认为讲解的很不错的文章,不多解释,写一篇最好懂的HTTPS讲解

8、用过C++的哪些框架?

     这个问题只要是面试稍微大点的公司,被问到的概率还是很大的,刚毕业找工作或者经验比较欠缺的人,往往很难回答好这个问题。所谓框架比如 libcurl、ProtoBuffer、gRPC等等,可以根据自己使用的一些东西去回答。

9、下面代码输出什么?

#include <iostream>
using namespace std;

void print(char* s)
{
	if (*s)
	{
		print(++s);
		printf("%c", *s);
	}
}

int main()
{
	char str[] = "Geneius";
	print(str);
	getchar();
	return 0;
}

// A、suiene  B、neius  C、run-time error D suieneG

     这个问题正确答案应该是A,但是当时面试时我选的是D,面试完回家之后我自己也是想了半天才明白,遇见递归莫名的就有点理不清,现在总算是思路清晰了。首先递归进入函数几次这个是很好确定的,本题进入print函数8次,那么函数肯定返回8次,第一次返回什么都不输出,第二次肯定是输出一个空,第一次啥都不返回比较好理解,第二次得细想一下才能明白输出空,重点在++s上,第三次当然是输出s了,剩下五次就选A了。

10、在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是:

struct A
{
	int a;
	short b;
	int c;
	char d;
};

struct B
{
	int a;
	short b;
	char c;
	int d;
};

// A、16 16   B、13 12  C、16 12  D、11 16

    正确答案应该是选C,下面是关于我总结的字节对齐的一些知识,看不明白可以私信或者评论问。

     字节对齐:一个变量占用n个字节,则该变量的起始地址必须是n的整数倍,即:存放起始地址 % n = 0;如果是结构体,那么结构体的起始地址是其最宽数据类型成员的整数倍。
     当对空间要求较高的时候,可以通过#pragma pack(n) 来改变结构体成员的对齐方式。#pragma pack(n)中的n用来设定变量以n字节对齐方式,可以设定的值包括:1、2、4、8。若需要取消强制对齐方式,则可用命令#pragma pack()。
     如果结构体成员数据类型宽度大于对齐参数,按对齐参数对齐,如果小于对齐参数,则按其自身的数据类型宽度对齐。最后结构体的大小必须是N(N = Min(最大成员, 对齐参数))的整数倍。

写在最后:面试流程

     面试流程有好多种,至少我遇见过好多种。有的公司上来就是先给一套笔试题或者一个上机题,做完之后根据你做题的结果再详谈,答题所用的时间和答题的结果都会影响到面试。还有公司没有机试或者笔试,上来就是技术大牛对你问各种问题,这个就看自己的准备是否充分了。当然也有一些公司由于一些原因会先进行电话面试或者视频面试,然后根据谈的结果再进行后续部分。大概面试流程也就这些了,其实说白了就是做笔试题或者上机题或者大牛当面问各种问题,这些问题我们平常工作写代码的时候还总是不是很注意的一些东西,所以面试之前刷题是很有必要的,只有这样面试的时候面对各种问题才会游刃有余。

    最后预祝大家找到自己心仪的工作。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值