一份面试题+整理的答案

在博客园看到一份面试题,觉得挺有意思,现在贴出来,并整理了一份答案。

原帖地址:http://www.cnblogs.com/feihe0755/p/3644295.html

extern "C"的作用?

extern "C" 修饰的变量和函数是按照C语言方式编译和连接的。

#pragma once方式和#ifndef方式的区别?

(转)#ifndef的方式受C/C++语言标准支持。它不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。
当然,缺点就是如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,编译器却硬说找不到声明的状况——这种情况有时非常让人抓狂。
由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,ifndef会使得编译时间相对较长,因此一些编译器逐渐开始支持#pragma once的方式。

#pragma once一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。
其好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。大型项目的编译速度也因此提高了一些。
对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,这种重复包含很容易被发现并修正。

增量链接什么意思?

增量链接应该是指对修改的代码,直接修改二进制文件中对应位置的二进制代码,而不用整个重新编译。

预编译头文件什么意思?起什么作用?

针对不经常修改的头文件进行预编译,VC下面编译成pch文件,不同于预处理,目的就是提高编译速度。

前置声明(forward declaration)的作用,什么情况下用?

前置声明一般用在解决头文件相互包含问题,作用是告诉编译器有这么一种类型,具体类型的定义,后面会给出。

深拷贝、浅拷贝的介绍。

主要区别在对象的数据成员中有指针的情况,浅拷贝就是简单地内存复制,结果就是拷贝后的对象和拷贝前的对象指向同一个buffer,深拷贝会拷贝指针指向的buffer,这样拷贝对象和原始对象会分别指向两份内容相同但位置不同的数据。

多态的实现原理?多态释放内存时需要注意什么?

多态的实现原理在于对象中的存储的虚函数指针,释放内存需要注意,一定要调用实际对象的析构函数,而不能调用其某个父类的析构。

const 的几种用法,特别是针对指针变量时有什么需要注意的?

const int * p; == int const * p;        //指针指向的值不能修改;

int * const p;        //指针本身的值不能修改;

void C::M() const;    //在该成员函数内不能修改类的成员变量

static成员变量、const成员变量、static const成员变量三者如何初始化?

static不能直接初始化,最好也不要在在头文件中初始化(存在重复定义的问题),放到cpp文件中初始化;

const成员变量在构造函数的冒号后面(不知道叫啥)初始化;

static const成员变量可以是数值类型,不能是其他复合类型,直接初始化;

简述快速排序的实现机理?

略,百度一下一堆。

什么时候适合使用const 加引用(&)?

http://www.cnblogs.com/lzjsky/archive/2011/01/04/1925277.html

sort(vInt.begin(), vInt.end(), less<int> ()); less<int> ()是什么意思,存放结构体的vector排序如何做?

链接库的有哪些?

DLL导出的一个方法中的参数能不能是vector类型?为什么?

大部分C++标准库里提供的类直接或间接地使用了静态变量。由于这些类是通过模板扩展而来的,因此每个可执行映像(通常是.dll或.exe文件)就会存在 一份只属于自己的、给定类的静态数据成员。当一个需要访问这些静态成员的类方法执行时,它使用的是“这个方法的代码当前所在的那份可执行映像”里的静态成 员变量。由于两份可执行映像各自的静态数据成员并未同步,这个行为就可能导致访问违例,或者数据看起来似乎丢失或被破坏了。

http://support.microsoft.com/default.aspx?scid=kb;en-us;172396

扩展DLL展出一个对话框类,调用的时候需要重点注意什么?

多线程中,有一个线程有一个比较大的for循环,这个时候在for循环中添加Sleep(0),有什么作用?

放弃当前CPU时间片的作用。

API CreateThread和_beginthreadex创建线程有什么区别?

前者是Windows API,后者是C API,http://www.cnblogs.com/project/archive/2011/08/21/2147634.html

线程的同步互斥.

工作者线程和用户界面线程有什么区别?

一个WIN32窗口程序创建的过程.

对CRuntimeClass的理解.

Windows消息机制.

下列宏有什么了解吗?

BEGIN_MESSAGE_MAP(CMPToolsDlg, CDialog)

//{{AFX_MSG_MAP(CMPToolsDlg)

ON_WM_SYSCOMMAND()

ON_MESSAGE(WM_DEVICECHANGE, OnDeviceChange)

END_MESSAGE_MAP()

OOP的一些指导原则?对OOP的理解.

如何调试多线程中指定线程?

两个进程间如何用消息传递字符串?

直接放到wParam,或者lParam;

WM_COPY_DATA

如果内存泄露,如何查找问题?如果有内存溢出导致的程序崩溃,如何查找?

利用工具,vld;

一般来讲,通过crash的dump,可以找到溢出位置;

原文地址:https://www.cnblogs.com/quark/p/3652764.html