您的位置:首页 > 编程语言 > C语言/C++

关于笔试题中C++的一些基础知识

2010-08-03 22:11 633 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: