同花顺2018秋招C++试题
1. C的static函数有什么特点?在C++中如何实现类似效果(不用static)?
2. 在一个工程里面有一个头文件base.h,在aa.cpp和bb.cpp都包含了这个头文件:
(1) 如果在base.h定义了一个全局变量
int g_ntest;
能编译通过吗?为什么?
(2) 如果在base.h定义了一个静态变量
static int g_ntest;
能编译通过吗?为什么?
3. C++0x是什么,里面有哪些新特性
4. 请选出下列代码中你认为正确的选项(多选),如果有错误的,请写出错误的原因。
(A) char s[5] = [‘a’, ‘b’, ’c’, ‘d’,’e’]’;
(B) char s[5] = “abcde”;
(C) char s[5]; s = “abcde”;
(D)char* s; s = “abcde”;
Test{
private static String getA() {return “a”;}
public static void main(String[] args){
String a = “a”;
final String c = “a”;
String b = a + “b”;
String d = c + “b”;
String e = getA() + “b”;
String compare = “ab”;
System.out.println(b == compare);
System.out.println(d == compare);
System.out.println(e == compare);
}
}
输出的结果是什么?
6. 如何让c++不分配内存但调用构造函数?
如何让c++ new一个对象的时候只分配内存但不调用构造函数?
7.
class A {
public:
A();
~A();
public:
bool Init(int a);
}
如何使用typedef表示A中的Init这一类的成员函数?
8. 你知道有哪些字符集编码格式?常见的乱码原因有哪些?
9. 请分别写出double、int、float、bool、指针类型的变量A与”零”的比较语句
10. 什么是深拷贝?什么是浅拷贝?
11. 在多线程编程中,往往会遇到线程安全问题,编程中需要小心。
列举一些c语言中常用的线程不安全的函数、或开源库中的接口函数。
12. 下列代码有什么问题,执行结果是什么?
class classA
{
public:
void SetValueAt(const CString& strKey, LPCTSTR lpsrValue);
void OutPut();
protected:
unsigned short m_nPeriod;
long m_lBeginTime;
long m_lEndTime;
}
void classA::SetValueAt(const CString& strKey, LPCTSTR lpszValue)
{
if(0 == strKey.CompareNoCase(“DateTime”))
{
scanf(lpszValue, T(“%d(%d-%d)”), &m_nPeriod, &m_lBeginTime, &m_lEndTime);
}
}
void classA::OutPut()
{
std::cout << &m_nPeriod << std::endl,
std::cout << &m_lBeginTime << std::endl,
std::cout << &m_lEndTime << std::endl
}
int main()
{
classA A;
A.SetValueAt(“DateTime”, “o(123-456)”);
A.OutPut();
}
13. struct CTestData
{
long m_long;
int m_int;
}
int _tmain(int argc, _TCHAR* argv[])
{
CTestData* p = NULL;
Int result = (int)&p->m_int;
return 0;
}
14. 为什么析构函数常定义成虚函数?
15. A.dll中有一个get_something接口,如下
char* get_something()
{
char* p = new char[256];
memset(p, 0, sizeof(p));
//对p就行赋值操作 具体代码略
//…
return p;
}
B.dll中如下调用
char* ret = get_something()
//use ret
//…
delete ret;
以上代码是否有问题?如果有请指出并说明原因和修复方式。
16. 解释堆和栈的区别?使用C/C++代码举例。
二. 开放逻辑题
1. 当你发现有用户在搜索引擎中搜以下词汇,你觉得用户分别是想了解什么信息?“金属 官员”,“高盛高华 煤”
2. 同花顺客户端有一个功能叫做键盘精灵,当键盘输入时,能显示出相关的股票代码。比如输入0,会显示出000001、000002等几千个股票代码。
这些股票代码在内存中存储时,有几万个结构体,在用List控件显示时,需要往List控件中插入几万条信息。
针对上述描述,你认为有什么地方可以优化、怎么优化,使得程序性能提升,用户体验优化?
三. 编程题
1. 对下面字符串进行转换,将”sdSdsfdAdsdsdfsfdsdASDSDFDSFs”字符串大写变小写,并且将字符串变为镜像字符串,例如:’A’变成’Z’,’b’变成’y’
2. 使用html和css实现一个下拉列表,鼠标进入显示三个子菜单,鼠标离开隐藏子菜单
3. 实现如下函数,要求输入年月日,返回该参数对应这年的第几天:
int GetDay(int nTime);
例如:nTime = 20150817, 则需要返回2015年8月17号这天是2015年的第几天。
4. 请使用C++/PHP/Java中任意一门语言,使用面向对象的思想为同花顺牧场设计一台能自动给多种家畜喂饲料的机器,要求既能满足喂养牧场中现有家畜的喂养,又能很方便的支持未来引进其他品种的家畜。
5. 编写一个线程安全的单例模式,语言不限。
6. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
7. 不使用中间变量交换两个数的值,请尽可能的写出多种方法。
8. 使用递归算法把一个单向链表反转函数定义声明如下:
struct List{
int iValue;
List *next;
};
List *reverse(List *oldList, List *newHead = NULL)
9. 描述:
写一个程序计算单词的数量且按照数量的大小排序。
Input:
文本文件,其中每一行一个单词。
Output:
<word_one><space><count_one>
<word_two><space><count_two>
其中count_one, count_two, …从大到小排序
要求:
试用任何一种脚本语言完成这个程序。
10. Reverse String
四. 阅读题
1. 有如下html片段,实现点击每个单元格输出该单元格内的值转换成百分比(保留2位小数)和该单元格对应的表头,输出格式如“同花顺:3.30%”
<table>
<thead>
<tr>
<th>股票名称</th>
<th>涨跌幅</th>
</tr>
</thead>
<tbody>
<tr>
<td>同花顺</td>
<td>0.03<>/td>
</tr>
<tr>
<td>…</td>
</tr>
…共2000行
</tbody>
</table>
2. 找错
(1)
Void test1()
{
char string[10],
char* str1 = “0123456789”;
strcpy(string, str1);
}
(2)
Void test2()
{
char string[10], str1[10];
for(i= 0; i < 10; i++)
{
str1[i] = ‘a’;
}
strcpy(string, str1);
}
(3)
Void test3(char* str1)
{
char string[10];
if(strlen(str1)<=10)
{
strcpy(string, str1);
}
}
3. int main(int argc, char ** argv)
{
int sockfd, new_fd; /*监听socket:sock_fd,数据传输socket:new_fd*/
struct sockaddr_in my_addr; /*本机地址信息*/
struct sockaddr_in their_addr; /*客户地址信息*/
unsigned int sin_size, myport, lisnum;
if(argv[1]) myport = atoi(argv[1]);
else myport = 7838;
if(argv[2]) lisnum = atoi(argv[2])’
else lisnum = 2;
if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
perror(“socket”);
exit(1);
}
my_addr.sin_family = PF_INET;
my_addr.sin_port = htons(myport);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 0);
if(bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1){
perror(“bind”);
exit(1);
}
if(listen(sockfd, lisnum) == -1){
perror(“listen”);
exit(1);
}
while(1){
sin_size = sizeof(struct sockaddr_in);
if((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1){
perror(“accept”);
continue;
}
printf(“server:got conection from %s\n”, inet_ntoa(their_addr, sin_addr));
if(!fork()){
if(send(new_fd, “Hello world!\n”, 14, 0) == -1){
perror(“send”);
close(new_fd);
exit(0);
}
}
close(new_fd); /*父进程不再需要该socket*/
waitpid(-1, NULL, WHOHANG); /*等待子进程结束,清除子进程所占用资源*/
}
}
这是一段简单的tcp服务器的代码,常见于一些demo中,如果将其用于正式的有着5000个在线用户的服务器,会有哪些问题。
4. 谈谈对下面两个类的理解,它们存在什么问题吗?在设计上有什么可以改进的地方吗?
class classA
{
public:
void Draw();
protected:
void dosomething();
void dosomething2();
…
void dosomethingX();
void dosomethingN();
}
classB
{
public:
void UpdataAllObjects(),
bool IsFlag() const{return m_bFlag;}
vois SetFlag(bool bFlag) {m_bFlag = bFlag;}
protected:
void dosomething(),
void dosomething2(),
…
void dosomethingX(),
void dosomethingN(),
protected:
bool m_Flag,
classA* m_pA,
}
void classA:Draw()
{
dosomething(),
dosomething2(),
…
dosomethingX(),
dosomethingN()
}
void classA::dosomethingX()
{
dosomething()
…
classB* pB = global::GetBHandle();
if(pB)
{
pB -> SetFlag(false);
pB-> UpdateAllObjects();
}
}
void classB::UpdateAllObjects()
{
dosomething(),
dosomething2(),
…
dosomethingX(),
dosomethingN(),
}
void classB::dosomethingX()
{
if(m_pA && m_bFlag)
{
m_pA -> Draw()
}
}
namespace global
{
classB* GetHandle()
{
static classB* pB = NULL;
if(NULL == pB)
{
pB = new classB
}
return pB;
}
}
#笔试题目##秋招##前端##同花顺#