东软C++笔试(6)

2019-06-11 09:48

8. 以下代码中的输出语句输出0吗,为什么? struct CLS {

int m_i;

CLS( int i ) : m_i(i) {} CLS() {

CLS(0); } };

CLS obj;

cout << obj.m_i << endl;

答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。

9. C++中的空类,默认产生哪些类成员函数? 答:

class Empty {

public:

Empty(); // 缺省构造函数

Empty( const Empty& ); // 拷贝构造函数 ~Empty(); // 析构函数

Empty& operator=( const Empty& ); // 赋值运算符 Empty* operator&(); // 取址运算符

const Empty* operator&() const; // 取址运算符 const };

10. 以下两条输出语句分别输出什么? float a = 1.0f;

cout << (int)a << endl; cout << (int&)a << endl;

cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么? float b = 0.0f;

cout << (int)b << endl; cout << (int&)b << endl;

cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么?

答:分别输出false和true。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。

注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以

浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。 通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。

11. 以下代码有什么问题? typedef vector IntArray; IntArray array;

array.push_back( 1 ); array.push_back( 2 ); array.push_back( 2 ); array.push_back( 3 );

// 删除array数组中所有的2

for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor ) {

if( 2 == *itor ) array.erase( itor ); }

答:同样有缺少类型参数的问题。另外,每次调用“array.erase( itor );”,被删除元素之后的内容会自动往前移,导致迭代漏项,应在删除一项后使itor--,使之从已经前移的下一个元素起继续遍历。

12. 写一个函数,完成内存之间的拷贝。[考虑问题是否全面] 答:

void* mymemcpy( void *dest, const void *src, size_t count ) {

char* pdest = static_cast( dest ); const char* psrc = static_cast( src ); if( pdest>psrc && pdest{

for( size_t i=count-1; i!=-1; --i ) pdest[i] = psrc[i]; } else {

for( size_t i=0; ipdest[i] = psrc[i]; }

return dest; }

1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数; 答:

//假设线性表的双向链表存储结构 typedef struct DulNode{

struct DulNode *prior; //前驱指针 ElemType data; //数据

struct DulNode *next; //后继指针 }DulNode,*DuLinkList; //删除操作

Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e) {

if(!(p=GetElemP_DuL(L,i))) //此处得到i位置的节点指针,如果有需要也得写出具体函数实现

return ERROR; e=p->data;

p->prior->next=p->next; p->next->prior=p->pror; free(p); return OK; }

//插入操作

Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e) {

if(!(p=GetElemP_DuL(L,i))) return ERROR;

if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR;

s->data=e;

s->prior=p->prior; p->prior->next=s; s->next=p; p->prior=s; return OK; }

2.写一个函数,将其中的\\t都转换成4个空格。 答:

该函数命名为convert,参数的意义为:

*strDest目的字符串,*strSrc源字符串,length源字符串的长度 函数实现为:

char* convert(char *strDest, const char *strSrc,int length) {

char * cp = strDest; int i=0;

while(*strSrc && i{

if (*strSrc=='\\t') //将\\t转换成4个空格 {

for(int j=0;j<4;j++) *cp++=' '; }

else //否则直接拷贝 *cp++=*strSrc; strSrc++; i++; }

return strDest; }

3.Windows程序的入口是哪里?写出Windows消息机制的流程。 答:

Windows程序的入口是WinMain函数 消息机制:系统将会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统。

4.如何定义和实现一个类的成员函数为回调函数? 答:

所谓的回调函数,就是预先在系统的对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。

定义一个类的成员函数时在该函数前加CALLBACK即将其定义为回调函数,函数的实现和普通成员函数没有区别

5.C++里面是不是所有的动作都是main()引起的?如果不是,请举例。

答:不是,比如中断引起的中断处理不是直接由main()引起的,而是由外部事件引起的。

6.C++里面如何声明const void f(void)函数为C程序中的库函数? 答:在该函数前添加extern “C”声明

7.下列哪两个是等同的 int b;

A const int* a = &b; B const* int a = &b;

C const int* const a = &b; D int const* const a = &b; 答:

各式表示的意思分别为:

A const int* a = &b; //*a是const,但指针a可变 B const* int a = &b; //a是const,但*a可变

C const int* const a = &b; //a和*a都是const,常量和指针的值都不能改变 D int const* const a = &b; //a和*a都是const,常量和指针的值都不能改变 因此C,D两者是相同的。

总结个技巧:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。

8. 内联函数在编译时是否做参数类型检查?

答:做类型检查,因为内联函数就是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来代替

1. C++中如何阻止一个类被实例化?

纯虚函数;构造函数私有化(友元)

2. 一般在什么时候构造函数被声明成private呢?

singleton模式; 阻止某些操作(如阻止拷贝构造)

3. 什么时候编译器会生成默认的copy constructor呢?

用户没有自定义copy constructor;在代码中使用到了copy constructor; 4. 如果你已经写了一个构造函数,编译器还会生成copy constructor吗?

5. struct和class有什么区别?

答:默认的访问级别不同,struct是public,class是private

6. 没有别的不同了吗?

7. 为什么说如果一个类作为基类,则它的析构函数要声明成virtual的?

因为,如果delete一个基类的指针时, 如果它指向的是一个子类的对象,那么析构函数不为虚就会导致无法调用子类析构函数,从而导致资源泄露。 当然,另一种做法是将基类析构函数设为protected.

8. inline的函数和#define有什么区别?

1) 宏是在预编译阶段简单文本替代, inline在编译阶段实现展开 2)宏肯定会被替代,而复杂的inline函数不会被展开 3)宏容易出错(运算顺序),且难以被调试,inline不会

4)宏不是类型安全,而inline是类型安全的,会提供参数与返回值的类型检查 当出现以下情况时inline失败

9. inline是什么意思?

10. 那你说说什么时候会真的被inline,什么时候不会呢?

当出现以下情况时inline失败:函数size太大;inline虚函数函数中存在循环或递归函数;调用其他inline函数

11. 如果把一个类的成员函数写在类的声明中是什么意思? inline此函数 (inline与template类似, 必须在.h中实现)

12. public继承和private继承有什么架构上的区别?

public是is-a的关系,继承接口与实现;private是has-a的关系 ,只继承实现

13. 在多继承的时候,如果一个类继承同时继承自class A和class B,而class A和 B中都有一个函数叫foo(),如何明确的在子类中指出override哪个父类的foo()?

14. 虚拟继承的语法是什么?

A / \\ B C \\ / D class A{};

class B: virtual public A{}; class C: virtual public A{}; class D: public B, public C{};


东软C++笔试(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:合成氨生产工艺流程 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: