C、16000
2
3
2
D、4
1101
13002
60
p1 为指向一维数组的指针,所以 a + 1 指向{50,60,70,80}这一维的地址。减一则为 4 的
地址;同理第二个输出 1101。同理,由于数组的列是 4,所以*(p2 - 1) + 16 就相当于*(p2)
+ 12,所以第三个输出 13002。
第四个由于 p1 是指针,所以 sizeof(p1)为 8(68 位的系统),所以第四个输出 60。
6、在 32 位操作系统 gcc 编译器环境下,下面的程序的运行结果是(A)
[cpp] view plaincopyprint?
1. class
A
2. {
3. public:
4.
5.
6.
7.
8.
9.
10. };
11.
int
b;
char
c;
virtual
void
print()
{
}
cout<<"this
is
father's
function!"<
A、12
12
B、8
C、9
8
9
D、12
16
7、以下哪些做法是不正确或者应该极力避免的:【多选】(ACD)
A、构造函数声明为虚函数
B、派生关系中的基类析构函数声明为虚函数
C、构造函数调用虚函数
D、析构函数调用虚函数
8、关于 C++标准模板库,下列说法错误的有哪些:【多选】(AD)
A、std::auto_ptr类型的对象,可以放到 std::vector>
容器中
B、std::shared_ptr类型的对象,可以放到 std::vector>容器中
C、对于复杂类型 T 的对象 tObj,++tObj 和 tObj++的执行效率相比,前者更高
D、采用 new 操作符创建对象时,如果没有足够内存空间而导致创建失败,则 new 操作符会
返回 NULL
A 中 auto 是给别人东西而自己没有了。所以不符合 vector 的要求。而 B 可以。C 不解释。
new 在失败后抛出标准异常 std::bad_alloc 而不是返回 NULL。
9、有如下几个类和函数定义,选项中描述正确的是:【多选】(B)
[cpp] view plaincopyprint?
1. class
A
2. {
3. public:
4.
5. };
6.
7. class
B
8. {
9. public:
10.
11. };
12.
virtual
void
foo()
{
}
virtual
void
foo()
{
}
13. class
C
:
public
A
,
public
B
14. {
15. public:
16.
17. };
18.
virtual
void
foo()
{
}
19. void bar1(A
*pa)
20. {
21.
22. }
23.
B
*pc
=
dynamic_cast(pa);
24. void bar2(A
*pa)
25. {
26.
27. }
28.
B
*pc
=
static_cast(pa);
29. void bar3()
30. {
31.
32.
33.
34. }
C
A
B
c;
*pa
*pb
=
=
&c;
static_cast(static_cast(pa));
A、bar1 无法通过编译
B、bar2 无法通过编译
C、bar3 无法通过编译
D、bar1 可以正常运行,但是采用了错误的 cast 方法
选 B。dynamic_cast 是在运行时遍历继承树,所以,在编译时不会报错。但是因为 A 和 B
没啥关系,所以运行时报错(所以 A 和 D 都是错误的)。static_cast:编译器隐式执行的任
何类型转换都可由它显示完成。其中对于:(1)基本类型。如可以将 int 转换为 double(编
译器会执行隐式转换),但是不能将 int*用它转换到 double*(没有此隐式转换)。(2)对
于用户自定义类型,如果两个类无关,则会出错(所以 B 正确),如果存在继承关系,则可
以在基类和派生类之间进行任何转型,在编译期间不会出错。所以 bar3 可以通过编译(C
选项是错误的)。
10、在 Intel CPU 上,以下多线程对 int 型变量 x 的操作,哪几个不是原子操作,假定变量
的地址都是对齐的。【多选】(ABC)
A、x = y
B、x++
C、++x
D、x = 1
看下在 VC++6.0 下的汇编命令即可:从图可以看出本题只有 D 选项才是原子操作。
11、一般情况下,下面哪些操作会执行失败?【多选】(BCD)
[cpp] view plaincopyprint?
1. class
A
2. {
3. public:
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
string
a;
void f1()
{
}
printf("Hello
World");
void f2()
{
}
a
=
"Hello
World";
printf("%s",a.c_str());
virtual
void
f3()
{
}
printf("Hello
World");
virtual
void
f4()
{
}
a
=
"Hello
World";
printf("%s",a.c_str());
23. };
A、A *aptr = NULL;
aptr->f1();
B、A *aptr = NULL;
aptr->f2();
C、A *aptr = NULL;
aptr->f3();
D、A *aptr = NULL;
aptr->f4();
至于 A 为什么正确,因为 A 没有使用任何成员变量,而成员函数是不属于对象的,所以 A
正确。其实,A* aptr = NULL;aptr->f5();也是正确的,因为静态成员也是不属于任何对象
的。至于 BCD,在 B 中使用了成员变量,而成员变量只能存在于对象,C 有虚表指针,所以
也只存在于对象中。D 就更是一样了。但是,如果在 Class A 中没有写 public,那么就全都
是 private,以至于所有的选项都将会失败。
12、C++下,下面哪些 template 实例化使用,会引起编译错误?【多选】(CEF)
[cpp] view plaincopyprint?
1. template
class
stack;
2. void fi(stack);
//A
3. class
Ex
4. {
5.
6.
7. };
8.
stack
&rs;
//B
stack
si;
//C
9. int
main(void)
10. {
11.
12.
13.
14.
15.
16. }
stack
*sc;
//D
fi(*sc);
//E
int
i
=
sizeof(stack);
//F
return
0;
选 C E F; 请注意 stack 和 fi 都只是声明不是定义。我还以为在此处申明后,会在其他
地方定义呢,坑爹啊。
由于 stack 只是声明,所以 C 是错误的,stack 不能定义对象。E 也是一样,stack 只是申
明,所以不能执行拷贝构造函数,至于 F,由于 stack 只是声明,不知道 stack 的大小,所