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

腾讯C++笔试题(不知道是哪年的)

2012-03-06 19:44 781 查看
不知道正确答案,都是自己做的,有做的思路。此文起交流之用,做错的请指正,谢谢。


一. 单选题(每题4分,15题,共60分)

1.考虑函数原型void hello(int a,int b=7,char* pszC=”*”),下面的函数调用钟,属于不合法调用的是:

A hello(5) B.hello(5,8) C.hello(6,”#”) D.hello(0,0,”#”)
答:C。这个是函数的声明,如果参数在声明的时候有默认值一定要放到参数列表的最后。调用函数时,没有默认值的参数一定要赋值,C赋值类型错了

2.下面有关重载函数的说法中正确的是:
A.重载函数必须具有不同的返回值类型 B.重载函数形参个数必须不同

C.重载函数必须有不同的形参列表 D.重载函数名可以不同
答:C。构成函数重载的条件是:函数参数的个数不同,参数类型不同。返回值不同不能构成重载

3.分析一下程序的运行结果:

#include<iostream.h>

class CBase

{

public:

CBase(){cout<<”constructing CBase class”<<endl;}

~CBase(){cout<<”destructing CBase class”<<endl;}

};

class CSub : public CBase

{

public:

CSub(){cout<<”constructing CSub class”<<endl;}

~CSub(){cout<<”destructing CSub class”<<endl;}

};

void main()

{

CSub obj;

}

A. constructing CSub class B. constructing CBase class

constructing CBase class constructing CSub class

destructing CSub class destructing CBase class

destructing CBase class destructing CSub class

C. constructing CBase class

constructing CSub class

destructing CSub class

destructing CBase class

D. constructing CSub class

constructing CBase class

destructing CBase class

destructing CSub class
答:C。这个是关于继承的。子类构造一个对象时,先要父类去调用父类的构造函数,然后子类调用自己的构造函数完成子类的对象构造。析构时卸掉子类的,再卸掉父类的。
这个好像是跟栈是一样的。先进后出。

4.在一个cpp文件里面,定义了一个static类型的全局变量,下面一个正确的描述是:

A.只能在该cpp所在的编译模块中使用该变量

B.该变量的值是不可改变的

C.该变量不能在类的成员函数中引用

D.这种变量只能是基本类型(如int,char)不能是C++类型
答;A。static修饰的变量的内存是在堆上。这里的static变量还是全局变量。当然在该cpp所在的编译模块中使用该变量。static修饰的局部变量与全局变量的区别在于作用域的差别。static变量只能于局部访问,全局就顾名思义。但static变量不会因为函数的执行完成而被销毁。

5.观察下面一段代码:

class ClassA

{

public:

virtual ~ ClassA(){};

virtual void FunctionA(){};

};

class ClassB

{

public:

virtual void FunctionB(){};

};

class ClassC : public ClassA,public ClassB

{

public:

};
ClassC aObject;

ClassA* pA=&aObject;

ClassB* pB=&aObject;

ClassC* pC=&aObject;

关于pA,pB,pC的取值,下面的描述中正确的是:
A.pA,pB,pC的取值相同. B.pC=pA+pB

C.pA和pB不相同 D.pC不等于pA也不等于pB
答:A。他们都是aObject对象的地址。所以是相同的。但是pA,pB,pC尽管值是相同的,但是在访问数据的时候却不相同。pA只能访问A中的函数,pB只能访问B中的函数。pC能访问A B C中的函数。因为在指针赋值中,指针的类型发生了隐式的类型转换。

6.参照1.5的代码,假设定义了ClassA* pA2,下面正确的代码是:

A.pA2=static_cast<ClassA*>(pB);

B.void* pVoid=static_cast<void*>(pB);

pA2=static_cast<ClassA*>(pVoid);

C.pA2=pB;

D.pA2=static_cast<ClassA*>(static_cast<ClassC*>(pB));
答:D

7.参照1.5的代码,下面那一个语句是不安全的:

A.delete pA B.delete pB C.delete pC
答:B。B错误的原因是B没有写析构函数,默认的析构函数不是虚函数。这样当要销毁掉pB时,只是析构掉了pC指向的那块内存,而pB指向的内存没有被释放了,这就造成了内存泄露的问题。

8.下列程序的运行结果为:

#include<iostream.h>

void main()

{

int a=2;

int b=++a;

cout<<a/6<<endl;

}

A.0.5 B.0 C0.7 D.0.6666666-
答:B.a++后等于3.但是a的类型是int 型。所以3/6被四舍五入了。也就输出了0.

9.有如下一段代码:

#define ADD(x,y) x+y

int m=3;

m+=m*ADD(m,m);

则m的值为:
A.15 B.12 C.18 D.58
答:A。这是一个关于宏的,一定要注意,宏只是替换! 所以m=m+(m*m+m)=15;

10.如下是一个带权的图,图中结点A到结点D的关键路径的长度是:

A.13 B.15 C.28 D.58
答:这个在网上没有看到有图的。不能解答。是数据结构中的问题啦
11.下面的模板声明中,正确的是:

A.template<typename T1,T2>

B.template<class T1,T2>

C.template<class T1,class T2>

D.template<typename T1;typename T2>
答:C。模板的定义数据类型变量都是需要typename的,不能省略。A B省略了。D不是以分号相隔的。

12.在Windows编程中下面的说法正确的是:
A.两个窗口,他们的窗口句柄可以是相同的 B.两个窗口,他们的处理函数可以是相同的

C.两个窗口,他们的窗口句柄和窗口处理函数都不可以相同.
答:B。B是显而易见的正确。只要是窗口,他们都可以去调用CWnd中的成员函数,比如:SetWindowText。句柄是不可以相同的,句柄是唯一标示一个资源的指针。

13.下面哪种情况下,B不能隐式转换为A?

A.class B:public A{} B.class A:public B{}

C.class B{operator A();} D.class A{A(const B&);}
答:B。这个应该也是继承的问题。在讲虚函数的时候有讲到。B中B是A的父类。父类是不能隐式转换成子类的。相反就可以。

14.某公司使用包过滤防火墙控制进出公司局域网的数据,在不考虑使用代理服务器的情况下,下面描述错误的是”该防火墙能够( )”.

A.使公司员工只能访问Internet上与其业务联系的公司的IP地址.

B.仅允许HTTP协议通过,不允许其他协议通过,例如TCP/UDP.

C.使员工不能直接访问FTP服务器端口号为21的FTP地址.

D.仅允许公司中具有某些特定IP地址的计算机可以访问外部网络
答:B

15.数字字符0的ASCII值为48,若有以下程序:

main()

{

char a=’1’,b=’2’;

printf(“%c,”,b++);

printf(“%d\n”,b-a);

}

程序运行之后的输出结果是:

A.3,2 B.50,2 C.2,2 D.2,50
答:C。0是48,1是49,2是50,3是51

b++注意是右++,不是左++。注意他们的区别就不会做错了。b++返回的还是b。字符就是2。这是b是51,51-49=2。输出整数也就是2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: