大华有很多子公司,我当时还以为投递的大华总部,后来才发现是其子公司,其中就包括华飞智能和华橙网络。
本文由小b努力梳理,内容确实蛮多的,但是大华的笔试题就是这么实打实的还是挺不错的,所以也希望大家能耐心的看看,最后希望大家秋招收获满意offer!
注:以下内容为本人认为较难的题目及其涉及到的相关知识点
华飞智能-提前批
37道题(60min)
(1)struct A{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}
求sizeof(A) 答案:8
考查C语言相关位域知识点,阅读文章:
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用0和1表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种数据结构,叫做“位域”或“位段”,位域是操控位的一种方法。
位域的宽度不能超过它所依附的数据类型的长度。通俗地讲,成员变量都是有类型的,这个类型限制了成员变量的最大长度,:后面的数字不能超过这个长度。
位域也需要按内存对齐到需对齐数据类型的字节,以便提高存取效率。
(2)#define sum(a,b) a+b
printf(“%d\n”,sum(sum(2,5),sum(4,10)*sum(2,3));
求输出结果 34
考查C语言宏定义用法
(3)map<key,value>不是基本数据类型,则需要哪个实现函数(与operator相关)
(4)int a =320;
char p = (char)&a;
print(“%d\n”,*p);
求输出 答案:64 (320-256)
(5)程序执行代码放在哪个内存段中
(text)代码段:又称为文本段。存储可执行文件的指令;也有可能包含一些只读的常数变量,例如字符串常量等。
(6)析构函数中哪些动作不能执行
不能析构函数中抛出异常
从语法上面讲,析构函数抛出异常是可以的,C++并没有禁止析构函数引发异常,但是C++不推荐这一做法,从析构函数中抛出异常是及其危险的。
析构函数可能在对象正常结束生命周期时调用,也可能在有异常发生时从函数堆栈清理时调用。前一种情况抛出异常不会有无法预料的结果,可以正常捕获;但后一种情况下,因为函数发生了异常而导致函数的局部变量的析构函数被调用,析构函数又抛出异常,本来局部对象抛出的异常应该是由它所在的函数负责捕获的,现在函数既然已经发生了异常,必定不能捕获,因此,异常处理机制只能调用terminate()。若真的不得不从析构函数抛出异常,应该首先检查当前是否有仍未处理的异常,若没有,才可以正常抛出。
(7)哪种线程通信方式,尽量不要用锁
暂时确定共享内存需要锁
(8)面向对象程序设计的三个基本特征
封装,继承,多态,(抽象)
(9)32位输出sizeof(0xAABBCCDD)大小为 4,在C语言中整数默认是int型
(10)不用C/C++字符串库函数,编写函数strcpy()
char *strcpy(char *strDest,const char *strSrc)//源字符串参数用const修饰,防止修改源字符串
{
if(!strDest||!strSrc)//空指针检查
return NULL;
char *ad=strDest;//返回目标地址
while((*strDest++=*strSrc++)!=’\0’); //’\0’
return ad;
}
(11)C++的noexpect关键字含义
编译器在编译时能过做的检测非常有限,因此在C++11中异常声明被简化为以下两种情况:
(1)函数可以抛出任何异常;
(2)函数不可以抛出任何异常。
在C++11中,声明一个函数不可以抛出任何异常使用关键字noexcept.
(12)a是unsigned int类型,a%1024 == a & (1024-1)
(13)理解long long p = (long long)((long long)a);
(14)求 struct B{
char b[0];
short a;
}的大小
答案:2,char b[0]不占用内存空间
(15)C++通用迭代器遍历是哪个方法(举例:iter=erase(iter++))
顺序容器,如vector,deque
while()
{
iter = a.erase(iter);
}
else
{
iter++;
}
关联性容器,如map,set,list
用上面和下面方法皆可
while()
{
iter = a.erase(iter++);
}
else
{
iter++;
}
(16)C++lamda表达式是否可以如下使用
void (int a = [](return x+1;)())(cout<<a<<endl;)
华橙网络
(1)求输出
void f(int a=[])()
{
static int b = 1;
return b++;
}(){
std:cout<<a;
}
int main()
{
f();
f();
}
(2)C++所有容器中,通用的遍历删除方法是
iter = Vec.erase( iter);
(3)shared_ptr和weak_ptr的区别和联系
(4)char &rc = *pc 怎么写是否违法?不违法
测试代码
#include "stdafx.h"
#include <Windows.h>
#include<iostream>
using namespace std;
int main()
{
int a = 100, *pc;
pc = &a;
int &test = *pc;
cout << "test:" << test << endl;
system("pause");
return 0;
}
(5)求输出
#include<iostream>
struct X{
X(){std:cout<<”1”;}
X(const X&){std:cout<<”3”;}
~X(){std:cout<<”2”;}
void f(){std:cout<<”4”;}
} object;
int main()
{
X(object);
object.f();
}
输出11422
测试用例
#include "stdafx.h"
#include <Windows.h>
#include<iostream>
using namespace std;
class X {
public:
X() { std:cout << "1"; }
X(const X&) { std:cout << "3"; }
~X() { std:cout << "2"; }
void f() { std:cout << "4"; }
} object;
int main()
{
X(object); //声明了一个局部变量object,该变量与全局变量不同,
//所以会调用默认构造函数
//此情况与复制构造函数不同,复制构造函数需要生成一个新的类对象
object.f();
system("pause");
return 0;
}
(6)unsigned short 变量最大值 65536
#include "stdafx.h"
#include <Windows.h>
#include<iostream>
using namespace std;
int main()
{
unsigned short a = 0;
unsigned int tmp=0;
while (++a>tmp)
{
tmp = a;
}
cout << "Max unsigned short = :" << tmp << endl;
system("pause");
return 0;
}
(7)char b[0]的大小
(8)函数定义可以嵌套写吗 函数可以嵌套调用,不可以嵌套定义
(9)C语言常用的运行速度优化算法
(10)求输出
class A
{
public:
A()
{
printf(“A construct \n”);
func_init();
}
virtual ~A()
{
printf(“A Destruct \n”);
func_deinit();
}
virtual void func_init()
{
printf(“this is A func_init\n”);
}
virtual void func_deinit()
{
printf(“this is A func_deinit\n”);
}
}
int main()
{
A *p = new B();
delete p;
}
#include "stdafx.h"
#include <Windows.h>
#include<iostream>
using namespace std;
class A
{
public:
A()
{
printf("A construct \n");
func_init();
}
virtual ~A()
{
printf("A Destruct \n");
func_deinit();
}
virtual void func_init()
{
printf("this is A func_init\n");
}
virtual void func_deinit()
{
printf("this is A func_deinit\n");
}
};
class B:public A
{
public:
B()
{
printf("B construct \n");
func_init();
}
virtual ~B()
{
printf("B Destruct \n");
func_deinit();
}
virtual void func_init()
{
printf("this is B func_init\n");
}
virtual void func_deinit()
{
printf("this is B func_deinit\n");
}
};
int main()
{
A *p = new B();
//B *p = new B();
delete p;
system("pause");
return 0;
}
(11)switch()使用continue效果
在switch中使用的只有break,continue只能配合循环使用
(12)malloc如何申请整形数组内存
(13)一个线程可以创建另一个线程?
(14)非对称加密应用范畴
- 信息加密
收信者是唯一能够解开加密信息的人,因此收信者手里的必须是私钥。发信者手里的是公钥,其它人知道公钥没有关系,因为其它人发来的信息对收信者没有意义。 - 登录认证
客户端需要将认证标识传送给服务器,此认证标识(可能是一个随机数)其它客户端可以知道,因此需要用私钥加密,客户端保存的是私钥。服务器端保存的是公钥,其它服务器知道公钥没有关系,因为客户端不需要登录其它服务器。 - 数字签名
数字签名是为了表明信息没有受到伪造,确实是信息拥有者发出来的,附在信息原文的后面。就像手写的签名一样,具有不可抵赖性和简洁性。
简洁性:对信息原文做hash,得到digest。信息越短加密的耗时越少。
不可抵赖性:信息拥有者要保证签名的唯一性,必须是唯一能够加密digest的人,因此必须用私钥加密(就像字迹他人无法学会一样),得到签名。如果用公钥,那每个人都可以伪造签名了。
4.数字证书
问题起源:对1和3,发信者怎么知道从网上获取的公钥就是真的?没有遭受中间人攻击?
这样就需要第三方机构来保证公钥的合法性,这个第三方机构就是CA(Certificate Authority),证书中心。
CA用自己的私钥对信息原文所有者发布的公钥和相关信息进行加密,得出的内容就是数字证书。
信息原文的所有者以后发布信息时,除了带上自己的签名,还带上数字证书,就可以保证信息不被篡改了。信息的接收者先用CA给的公钥解出信息所有者的公钥,这样可以保证信息所有者的公钥是真正的公钥,然后就能通过该公钥证明数字签名是否真实了。
(15)菱形继承需要加什么关键字能防止资源浪费 virtual
(16)noexpect的作用
确认某个函数不会抛出异常;我们根本不知道该如何处理异常
通过C++11模板编程实现一个功能,判断模板参数是否为智能指针