2017昆仑万维技术类基础笔试题

1.为了避免头文件重复包含一般采用什么方法?

http://blog.csdn.net/xhfight/article/details/51550446


2.在c++程序中调用被C编译器编译后的函数,为什么要加extern “C”声明?

http://blog.chinaunix.net/uid-23028407-id-1992460.html


3.下面程序运行结果

#include 
#include
using namespace std;
void func(char str[])
{
	cout << sizeof(str) << endl;
}

typedef union {
	char a; 
	short b;
	int c;  
	float d;  //4字节 
}A;

typedef struct {
	char a;
	char b;
	int c;
}B;

typedef struct {
	char a;
	int b; //4字节 
	char c;
}C;

int main() 
{
	char str[] = "test";
	cout << sizeof(str) << endl;
	func(str);
	cout << sizeof(A) << endl;
	cout << sizeof(B) << endl;
	cout << sizeof(C) << endl;
}


答案:

5
4
4
8
12


解析:

第一个sizeof是求取内存,包含结束字符\0,所以输出4+1=5

第二个数组作为函数参数传递,退化为指针,32位情况下,指针大小为4

第三个union是取最大的那个内存,float位4个字节

第四个两个char放一个4字节对齐就够了,剩下一个4字节,4+4=8

第五个3个都要分开放了,4+4+4=12,


4.下面程序运行结果

class CTest
{
	public:
		CTest(const char* str)
		{
			strcpy(name,str);
			cout<< "constructor for " << name <


答案:

constructor for global
constructor for a
constructor for b
copy constructor for a
constructor for local
constructor for static
copy constructor for local
destructor for local
destructor for a
destructor for b
destructor for local
destructor for a
destructor for static
destructor for global


解析:

http://bbs.csdn.net/topics/392034471

5.下面程序运行结果

class CObject
{
public:
	CObject(){
		cout << "CObject::CObject()" << endl;
	}
	virtual ~CObject(){
		cout << "CObject::~CObject" << endl;
	}
	virtual void Serialize(){
		cout << "CObject::Serialize()" <func();
	cout << "33333333333333333333" <func();
}


答案:

11111111111111111
CObject::CObject()
CDocument::CDocument()
CMyDoc::CMyDoc()
22222222222222222222
CDocument::func()
CMyDoc::Serilize()
33333333333333333333
CMyDoc::~CMyDoc()
CDocument::~CDocument()
CObject::~CObject
444444444444444444444
CObject::CObject()
CDocument::CDocument()
CMyDoc::CMyDoc()
55555555555555555555555
CDocument::func()
CMyDoc::Serilize()
66666666666666666666666
CDocument::func()
CMyDoc::Serilize()
CMyDoc::~CMyDoc()
CDocument::~CDocument()
CObject::~CObject


解析:
主要考察了:

1.派生类对象的构造顺序,先调用最顶层的基类默认构造函数,最后才到自己

2.析构的顺序,先析构派生类的,最后是基类的

3.函数重载,重写,和重定义的区别的利用,这里主要考察了重定义这个用法,调用的是派生类的函数



6.单链表的翻转;链表排序?(忘了)


主要代码如下:

pNode = pHead;
pPre = NULL;
while (pNode != NULL)
{
	pNext = pNode->next;
	pNode->next = pPre;
	pPre = pNode;
	pNode = pNext;
}
解析:

让当前节点的指向下一个节点存储上前一个,这样就翻转过来了

pNext是为了移位时候,顺利保存下一个节点指针用的

你可能感兴趣的:(笔试题)