牛客网(C/C++工程师综合练习卷)

题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]

题解:int  (*p)[4]表示一个数组指针,p指向一个含有4个int元素的数组。
区别int  *p[4],这个表示一个指针数组,该数组有4个元素,每个元素都是一个指针。


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

A:线程安全问题都是由全局变量及静态变量引起的
B:若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全
C:c++标准库里面的string保证是线程安全的
D:POSIX线程标准要求C标准库中的大多数函数具备线程安全性

题解:标准库里面的string在多线程下并不保证是都是安全的,只提供两种安全机制:1.多个线程同时读取数据是安全的。2.只有一个线程在写数据是安全的。

题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 

题解:func1()为非虚函数,调用基类还是派生类完全取决于函数形参的静态类型,本题中为Base的类型。pb->func1()中调用func2(),该函数为虚函数,通过虚函数表调用。每次通过指针或者引用调用它时,都调用的是它实际类型的函数。如果形参与实参类型不符,可以通过强制类型转化来完成匹配,但即使强制类型转化后,并没有改变虚函数表里面的内容,所以不管你如何转化,都调用的它实际指向对象的那个函数。此处为Child的func2()。


11:下面代码的输出是什么? 

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); 
}
A: ~B                 B:~B~A                   C:~B~A~A                 D:~B~A~A~A

题解:定义对象时调用了依次A的构造函数;通过a对象复制构造b,B中包含了一个A 类型的成员变量,需调用一次A的构造函数;构造B对象时首先要先构造A的对象然后构造B的对象。所以总共调用了三次A的构造函数,依次B的构造函数,析构函数的顺序与构造顺序相反。

题14:C++类体系中,不能被派生类继承的有?
A:构造函数
B:静态成员函数
C:非静态成员函数
D:赋值操作函数
题解:构造函数、拷贝构造函数、赋值函数、析构函数均不能被继承。友元函数也不能被继承,但由于友元不是成员函数。

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

A:静态成员存在于内存,非静态成员需要实例化才会分配内存
B:非静态成员可以直接访问类中静态的成员
C:静态成员能访问非静态的成员
D:非静态成员的生存期决定于该类的生存期,而静态成员则不存在生存期的概念
题解:静态成员属于类,不需要生成对象就存在了。而非静态需要生成对象才产生.所以静态成员不能直接访问。
静态方法只能访问静态成员(包括成员变量和成员方法)非静态方法可以访问静态也可以访问非静态。静态成员的性质也决定了satic member function 无法被声明成虚拟函数

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

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

A:0x201 , 0x403 , 0x807060504030201 , 0x0
B: 0x201 , 0x605 , 0x807060504030201 , 0x0
C: 0x201 , 0x605 , 0x4030201 , 0x8070605
D: 0x102 , 0x506 , 0x102030405060708 , 0x0

题解:int占4个字节,int64占8个字节





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值