题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:线程安全问题都是由全局变量及静态变量引起的
题解:int (*p)[4]表示一个数组指针,p指向一个含有4个int元素的数组。
区别int *p[4],这个表示一个指针数组,该数组有4个元素,每个元素都是一个指针。
题7:下面有关c++线程安全,说法错误的是?
A:线程安全问题都是由全局变量及静态变量引起的
B:若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全
C:c++标准库里面的string保证是线程安全的
D:POSIX线程标准要求C标准库中的大多数函数具备线程安全性
题解:标准库里面的string在多线程下并不保证是都是安全的,只提供两种安全机制:1.多个线程同时读取数据是安全的。2.只有一个线程在写数据是安全的。
题解:标准库里面的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的构造函数;通过a对象复制构造b,B中包含了一个A 类型的成员变量,需调用一次A的构造函数;构造B对象时首先要先构造A的对象然后构造B的对象。所以总共调用了三次A的构造函数,依次B的构造函数,析构函数的顺序与构造顺序相反。
题14:C++类体系中,不能被派生类继承的有?
A:构造函数
B:静态成员函数
B:静态成员函数
C:非静态成员函数
D:赋值操作函数
题解:构造函数、拷贝构造函数、赋值函数、析构函数均不能被继承。友元函数也不能被继承,但由于友元不是成员函数。
题16:下面有关类的静态成员和非静态成员,说法错误的是?
题解:构造函数、拷贝构造函数、赋值函数、析构函数均不能被继承。友元函数也不能被继承,但由于友元不是成员函数。
题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个字节