C/C++综合测试题(三)

又刷了一套题

 

这些题都是百度、阿里巴巴、腾讯、网易、新浪等公司的面试原题,有一定的难度,不过确实相当有水平,可以通过做题来查漏补缺。

 

1.补充下面函数代码: 

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

#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 ( );
}



A.    pStr1<pStr2str1

B.    pStr1+n< pStr2str2

C.   pStr1+n< pStr2 || pStr2+n<pStr1str2

D.   pStr2+n<pStr1str1

 


答案:A

 

只要pStr1的地址在pStr2的前面,甚至是,pStr1的起始地址和pStr2一样。

如下语句

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

就可以保证pStr2在被覆盖前,将值copypStr1。

最后返回非constStr1。



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

A. x[0][1]

B. x[0][2]

C. x[1][0]

D. x[2][0]



 


答案:D

int  (*p)[4]是一个int型的数组指针,p=x,即为,p指向x[6][4]的首地址,p=&x[0][0]

*(p)=x[0][0]*(p+2)=x[0+2][0]



 

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

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

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

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

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

 



答案:C

注意,模板类不能在运行时检查数据类型,运行时检查是多态的特性



4.

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)= ?

A.30

B.20

C.16

D.0



 

答案:D

没有break语句,所以一直向下执行,执行到b=0结束

 


5.

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)分别是多少。

A. 12 16

B. 12 12

C. 16 24

D. 16 20

 



答案:C

copy别人的,人家写的非常好

根据以下条件进行计算:
1  结构体的大小等于结构体内最大成员大小的整数倍
2、  结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如说double型成员相对于结构体的首地址的地址偏移量应该是8的倍数。
3、  为了满足规则1和2编译器会在结构体成员之后进行字节填充!

A中,a占4个字节,b本应占2个字节,但由于c占4个字节,为了满足条件2,b多占用2个字节,为了满足条件1,d占用4个字节,一共16个字节。
B中,a占8个字节,b占2个字节,但由于c占4个字节,为了满足条件2,b多占用2个字节,
即abc共占用8+4+4=16个字节,
为了满足条件1,d将占用8个字节,一共24个字节。

 



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

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

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

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

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

 

 


答案:D

D说的明明是函数重载好不好。。。。

 

 


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

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

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

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

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




答案:C

 

C++标准库出现的时候,C++还没有线程的概念,所以string不能保证是线程安全的

 

 

8.以下程序的输出是

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;
}


A. 11

B. 101

C. 12

D. 102





答案:C

func1不是虚函数,func2是虚函数,所以

pb->func1();

调用的是Base类的func1和Child类的func2




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

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

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

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

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




答案:D

A中,const static类型可以在类体内进行初始化

 

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

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

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

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

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




答案:B





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。