分享

CC++工程师综合练习卷20题

 昵称25222630 2015-04-29

C/C++工程师综合练习卷

1.补充下面函数代码: 
如果两段内存重叠,用memcpy函数可能会导致行为未定义。 而memmove函数能够避免这种问题,下面是一种实现方式,请补充代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

1

#include <iostream>

using namespace std;

void* memmove(void* str1,const void* str2,size_t n)

{

    char* pStr1= (char*) str1;

    const char* pStr2=(const char*)str2;

    if  ( ) {

        for(size_t i=0;i!=n;++i){

            *(pStr1++)=*(pStr2++);

        }

    }

    else{

        pStr1+=n-1;

        pStr2+=n-1;

        for(size_t i=0;i!=n;++i){

            *(pStr1--)=*(pStr2--);

        }

    }

    return ( );

}

pStr1< pStr2   str1

pStr1+n < pStr2   str2

pStr1+n < pStr2 || pStr2+n<pStr1  str2

pStr2+n<pStr1   str1

 

2.int x[6][4],(*p)[4]: p=x;   *(p+2)指向哪里

x[0][1]

x[0][2]

x[1][0]

x[2][0]

 

3.下面有关C++中为什么用模板类的原因,描述错误的是?

可用来创建动态增长和减小的数据结构

它是类型无关的,因此具有很高的可复用性

它运行时检查数据类型,保证了类型安全

它是平台无关的,可移植性

 

[单选题]

1

2

3

4

5

6

7

8

9

10

11

12

int func(int a)

{

    int b;

    switch (a)

    {

        case 1: b = 30;

        case 2: b = 20;

        case 3: b = 16;

        default: b = 0;

    }

    return b;

}

 

 

 

 

func(1) = ?

30

20

16

0

 

4

1

2

3

4

5

6

7

8

9

10

11

12

class A

{

        int a;

        short b;

        int c;

        char d;

};

class B

{

        double a;

        short b;

        int c;

        char d;

};

 

32位机器上用gcc编译以上代码,求sizeof(A),sizeof(B)分别是多少。

12 16

12 12

16 24

16 20

5下面有关继承、多态、组合的描述,说法错误的是

封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏

继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展

隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了

覆盖是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同

 

6下面有关c++线程安全,说法错误的是?

线程安全问题都是由全局变量及静态变量引起的

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全

c++标准库里面的string保证是线程安全的

POSIX线程标准要求C标准库中的大多数函数具备线程安全性

 

以下程序的输出是

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

class Base {

    public:

    Base(int j): i(j)  {}

    virtual~Base() {}

    void func1() {

        i *= 10;

        func2();

    }

    int getValue() {

        return  i;

    }

    protected:

    virtual void func2() {

        i++;

    }

    protected:

    int i;

};

class Child: public Base {

    public:

    Child(int j): Base(j) {}

    void func1() {

        i *= 100;

        func2();

    }

    protected:

    void func2() {

        i += 2;

    }

};

int main() {

    Base * pb = new Child(1);

    pb->func1();

    cout << pb->getValue() << endl; delete pb; }

 

11

101

12

102

 

下面对静态数据成员的描述中,正确的是

静态数据成员可以在类体内进行初始化

静态数据成员不可以被类的对象调用

静态数据成员不受private控制符的作用

静态数据成员可以直接用类名调用

 

#include<file.h> 与 #include "file.h"的区别?

前者首先从当前工作路径搜寻并引用file.h,而后者首先从Standard Library的路径寻找和引用file.h

前者首先从Standard Library的路径寻找和引用file.h,而后者首先从当前工作路径搜寻并引用file.h

两者都是首先从Standard Library的路径寻找和引用file.h

两者都是首先从当前工作路径搜寻并引用file.h

 

下面代码的输出是什么?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

1

class A  

{  

public:  

    A()  {     }  

    ~A() {    cout<<"~A"<<endl;   }  

};  

   

class B:public A  

{  

    public:  

        B(A &a):_a(a)  

        {  

             

        }  

        ~B()  

        {  

            cout<<"~B"<<endl;  

        }  

    private:  

        A _a;  

    };  

       

int main(void)  

 {  

        A a;       //很简单,定义a的时候调用了一次构造函数  

        B b(a); 

}

 

~B

~B~A

~B~A~A

~B~A~A~A

以下程序的结果? 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

void foo(int *a, int *b)

{

    *a = *a + *b;

    *b = *a - *b;

    *a = *a - *b;

}

void main()

{

    int a = 1, b = 2, c = 3;

    foo(&a, &b);

    foo(&b, &c);

    foo(&c, &a);

    printf("%d, %d, %d", a, b, c);

}

123

132

213

321

 

下列一段C++代码的输出是

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#include "stdio.h"

class Base

 {

 public:

     int Bar(char x)

     {

         return (int)(x);

     }

     virtual int Bar(int x)

     {

         return (2 * x);

     }

 };

 class Derived : public Base

 {

 public:

     int Bar(char x)

     {

         return (int)(-x);

     }

     int Bar(int x)

     {

         return (x / 2);

     }

 };

 int main(void)

 {

     Derived Obj;

     Base *pObj = &Obj;

     printf("%d,", pObj->Bar((char)(100)));

     printf("%d,", pObj->Bar(100));

 }

100-100

10050

200-100

20050

 

C++类体系中,不能被派生类继承的有

构造函数

静态成员函数

非静态成员函数

赋值操作函数

 

下面有关mallocnew,说法错误的是? 

new 建立的是一个对象, malloc分配的是一块内存.

new   初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数,malloc仅仅分配内存,free仅仅回收内存

newmalloc  都是保留字,不需要头文件支持

newmalloc都可用于申请动态内存,new是一个操作符,malloc是是一个函数

 

下面有关类的静态成员和非静态成员,说法错误的是? 

静态成员存在于内存,非静态成员需要实例化才会分配内存

非静态成员可以直接访问类中静态的成员

静态成员能访问非静态的成员

非静态成员的生存期决定于该类的生存期,而静态成员则不存在生存期的概念

 

下列代码的输出为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

2

class CParent 

{

    public: virtual void Intro()

    {

        printf( "I'm a Parent, " ); Hobby();

    }

    virtual void Hobby()

    {

        printf( "I like football!" );

    }

}; 

class CChild : public CParent { 

    public: virtual void Intro()

    {

        printf( "I'm a Child, " ); Hobby();

    }

    virtual void Hobby()

    {

       printf( "I like basketball!\n" );

    }

}; 

int main( void )

{

    CChild *pChild = new CChild(); 

    CParent *pParent = (CParent *) pChild; 

    pParent->Intro(); 

    return(0);

}

I'm a Parent, I like football!

I'm a Parent, I like basketball!

I'm a Child, I like basketball!

I'm a Child, I like football!

 

32位小端的机器上,如下代码输出是什么:

1

2

3

4

5

char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08};     

 short *pshort = (short *)array;     

 int *pint = (int *)array;     

 int64 *pint64 = (int64 *)array;     

 printf("0x%x , 0x%x , 0x%x , 0x%x", *pshort , *(pshort+2) , *pint64 , *(pint+2));

0x201 , 0x403 , 0x807060504030201 , 0x0

0x201 , 0x605 , 0x807060504030201 , 0x0

0x201 , 0x605 , 0x4030201 , 0x8070605

0x102 , 0x506 , 0x102030405060708 , 0x0

 

switch(c)语句中,c不可以是什么类型()

int

long

char

float

 

头文件中的 ifndef/define/endif 干什么用?

定义常量

标记为特殊的头文件

防止头文件被重复引用

注释头文件

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多