1、先说说宏吧。好多公司的笔试题会在宏上出题,最常见的有以下三条语句。
1.1、2个数中取最小值,注意括号。
#define MIN( A, B ) ( (A) <= (B) ? (A) : (B))
1.2、这个题在选择题中经常出现,考察的是计算数的展开式
#define SQR(X) ( (x) * (x) )
1.3、考察定义值的长度
#define SEC_PER_YEAR( 60* 60 * 24 * 365) UL
重点举例说明第二条:
通常程序员粗心大意容易写成这样#define SQR(X) ( x * x ) 那么下面用例子测试下这个结果。
SQR(6+4); 这样的输入得出的结果是6+4×6+4 = 6+24+4 = 34 结果是错误的。所以这个地方是要注意的。
2、2个数字比较大小,求较大的值。要求不用判断语句(if , switch...)来实现。
int iMax = ( (a + b) + abs(a-b) ) / 2;
3、交换2个值。
3.1、书上的答案是这样,我也经常这样去写。
int iNum = a;
a = b;
b = iNum;
3.2、资料上的最优答案是。
a = a ^ b;
b = a ^ b;
a = a ^ b;
4、const的用法。
4.1、修饰常量
4.2、可以修饰函数参数、返回值、函数体、防止程序被意外修改。曾强程序的健壮性。
5、const 与 define 的区别。
const 定义常量时有数据类型 define 没有数据类型
const 可以进行调试 define 不可以
6、sizeof 与 strlen 的区别。
sizeof是运算符 strlen是库函数
sizeof可以用类型做参数 strlen只能用char*做参数
sizeof可以用函数做参数
strlen计算字符的长度不是类型占内存的大小
7、list删除时的操作
for ( it = IntArray.begin(); it != IntArray.end() ; )
{
if ( ... )
{
it = IntArray.erase(it);
}
else
{
++it;
}
}
8、拷贝构造函数与赋值函数的区别
class Test;
8.1、 Test a;
a = b;
8.2、 Test a = b;
Test a(b);
两者调用时间不同:
8.1、a构造完成,已有资源,然后等号进行赋值。
8.2、a此时还没有分配资源,赋值时不需要分配资源。
9、什么是“多态”?
在基类函数前面添加virtual关键字后,在派生类中重新该函数,运行时将会根据对象的实际类型调用相应的函数。
10、什么是虚函数?
用virtual关键字申明的函数叫虚函数。
11、析构函数为VIRTUAL是什么目的?
这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
12、 多线程的方法?
互斥对象、事件对象、关键代码段。
互斥对象与事件对象都属于内核对象,利用内核对象实现线程同步时,速度较慢。但可以在多进程中的各个线程间进行同步。
关键代码段速度较快,但在等待进入关键代码段时由于没有办法设置等待超时值。会造成线程的死锁。
13、WINDOWS内存原理?
Windows为每一个进程分配了4GB的地址空间。2GB的地址空间,用于存代码、数据、堆栈。2GB用于共享系统使用。
14、实现strcmp函数.
char* strcmp(char* strDest, const char* strSrc)
{
assert( (strDest != NULL) && (strSrc != NULL) );
char* address = strDest;
while( (*strDest++ = *strSrc++) != '/0' )
NULL;
return address;
}
15、链表倒置
node* ReverseList(node* head)
{
node* p = NULL;
node* q = head;
while( head->next != 0)
{
p = head->next;
head->next = p->next;
p->next = q;
q = p;
}
return q;
}
16、实现String类
class String
{
private:
char* m_data;
public:
String(const char* pStr);
~String();
String(const String& other);
String& operator=(const String& other);
}
String::String(const char* pStr)
{
if ( pStr == NULL )
{
m_data = new char[1];
*m_data = '/0';
}
else
{
int iSize = strlen(pStr);
m_data = new char[iSize+1];
strcpy(m_data, str);
}
}
String::~String(void)
{
delete []m_data;
}
String::String(const String& other)
{
int iSize = strlen(other.m_data);
m_data = new char[iSize+1];
strcpy(m_data, other.m_data);
}
String& String::operator=(const String& other)
{
if ( this != &other )
{
int iSize = strlen(other.m_data);
char* pCh = new char[iSize+1];
delete [] m_data;
m_data = pCh;
}
return *this;
}