文档库 最新最全的文档下载
当前位置:文档库 › 基础C++笔试题

基础C++笔试题

基础C++笔试题
基础C++笔试题

C++/C试题

本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。

笔试时间90分钟。请考生认真答题,切勿轻视。

一、请填写BOOL , float, 指针变量与“零值”比较的if 语句。(10分)

提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如int 变量n 与“零值”比较的if 语句为:

if ( n == 0 )

if ( n != 0 )

以此类推。

请写出BOOL flag 与“零值”比较的if 语句:

If (flag)

If (!flag)

请写出float x 与“零值”比较的if 语句:

Const float EXP = 0.000001;

If (x >= -EXP && x <= EXP)

请写出char *p 与“零值”比较的if 语句:

If (p == NULL)

If (p != NULL)

二、以下为Windows NT下的32位C++程序,请计算sizeof的值(10分)

char str[] = “Hello” ; char *p = str ;

int n = 10;

请计算

sizeof (str ) = 6

sizeof ( p ) = 4

sizeof ( n ) =4 void Func ( char str[100]) {

请计算

sizeof( str ) = 4 }

void *p = malloc( 100 ); 请计算

sizeof ( p ) =4

三、简答题(25分)

1、头文件中的ifndef/define/endif 干什么用?防止头文件被重复引用。

2、#include 和#include “filename.h” 有什么区别?

对于前者,编译器会从标准库路径开始搜索;

对于后者,编译器会从当前工作路径开始搜索。

3、const 有什么用途?(请至少说明两种)

(1)可以用const修饰变量,在编译时,会做类型检查。

(2)可以用const修改形参,防止该形参内容被修改。

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

C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为:void foo(int x, int y);

该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。

C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。

5、请简述以下两个for循环的优缺点

// 第一个

for (i=0; i

if (condition)

DoSomething();

else

DoOtherthing(); } // 第二个

if (condition)

{

for (i=0; i

}

else

{

for (i=0; i

优点:程序简洁

缺点:程序执行效率不高,且不能作为“流水线”处理。优点:程序效率高缺点:程序不简洁

四、有关内存的思考题(20分)

void GetMemory(char *p) {

p = (char *)malloc(100); }

void Test(void)

{ char *GetMemory(void)

{

char p[] = "hello world";

return p;

}

void Test(void)

char *str = NULL;

GetMemory(str);

strcpy(str, "hello world");

printf(str);

}

请问运行Test函数会有什么样的结果?

答:

导致运行程序崩溃。因为在函数中动态申请的内存,在函数返回时,就会被释放掉,所以调用GetMemory(str)后,str仍然为NULL,

当调用strcpy进行复制时,会发生程序崩溃。{

char *str = NULL;

str = GetMemory();

printf(str);

}

请问运行Test函数会有什么样的结果?答:可能会出现乱码。因为GetMemory函数中返回的P,是一个局部变量,在函数返回时,变会被释放掉,所以在执行到str=GetMemory();时,str将会变成一个“野指针”,指向的内容不可知,可以打印出来的是乱码。

Void GetMemory2(char **p, int num) {

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello");

printf(str);

}

请问运行Test函数会有什么样的结果?答:

能够输出hello

但是会造成内存泄漏。void Test(void)

{

char *str = (char *) malloc(100);

strcpy(str, “hello”);

free(str);

if(str != NULL)

{

strcpy(str, “world”);

printf(str);

}

}

请问运行Test函数会有什么样的结果?答:

可能会造成程序崩溃。因为str被free后,成为一个“野指针”,指向的内容尚不可知,在执行复制时,修改动态存储区的内容,可能会造成严重的后果。

五、编写strcpy函数(10分)

已知strcpy函数的原型是

char *strcpy(char *strDest, const char *strSrc);

其中strDest是目的字符串,strSrc是源字符串。(1)不调用C++/C的字符串库函数,请编写函数strcpy

char *strcpy(char *strDest, const char *strSrc)

{

Assert(strDest != NULL && strSrc != NULL);

Char *ret = strDest;

While ((*strDest++ = *strSrc++) != ‘\0’);

Return ret;

}

(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?为了实现连续赋值操作,如:

Int strcpy(str1, strcpy(str2, str3));

六、编写类String的构造函数、析构函数和赋值函数(25分)

已知类String的原型为:

class String

{

public:

String(const char *str = NULL); // 普通构造函数

String(const String &other); // 拷贝构造函数

~ String(void); // 析构函数

String & operate =(const String &other); // 赋值函数 private:

char *m_data; // 用于保存字符串};

请编写String的上述4个函数。

String::String(const char *str) // 普通构造函数

{

If (str == NULL)

{

M_data = new char[1];

If (m_data != NULL)

*m_data = ‘\0’;

}

Else

{

Int len = strlen(str);

m_data = new char[len+1];

If (m_data != NULL)

{

Strcpy(m_data, str); }

}

}

String::String(const String &other) // 拷贝构造函数{

Int len = strlen(other.m_data);

Delete [] m_data;

M_data = new char[len+1];

If (m_data != NULL)

Strcpy(m_data, other.m_data);

}

String::~ String() // 析构函数

{

Delete [] m_data; // 或者写成 delete m_data;

}

String::String & operate =(const String &other) // 赋值函数{

If (this == &other) // 判断是否是自已

Return *this;

Delete [] m_data;

M_data = new char[strlen(other.m_data) + 1];

If (m_data != NULL)

Strcpy(m_data, other.m_data);

Return *this; // 返回调用者的引用。

}

相关文档