部分答案
试题一第一部分答案:
还没找到,嘿嘿,..
试题一第二部分答案:
第一题
该程序的结果是编译错误。因为2和3不是合法的C++标识符的第一个字母。
第二题
B23
B2
B11
B24
B2
B12
关键点:
1,虚基类的初始化顺序在普通基类之前。
2,类成员的初始化顺序同其在类中声明的顺序,而不是在构造函数初始化列表中的顺序。
第三题
这个等式的值无意义。
为什么这样说呢?我们可以想出这些执行顺序:
1,先做第一个++i,再做第二个++i,再做第三个++i,为什么呢??因为()的优先级很高。
2,先做第一个++i,再做第二个++i,再做他们之间的加法。因为根据一般表达式的分析规则,的确可以先执行这个加法了。
为什么说这个等式无意义呢,因为在C++标准中,规定在一个sequence point中,只能对同一个变量写一次。如果改变了两次或以上,等式值为未定义。
第四题
编译出错,因为编译器无法判断func(0)该调用哪一个。
不要忘记,0可是一个指针常量。不相信?你可以看到这样的代码?
#define NULL (0)
void* p = NULL;
如果0不是指针常量,这句话就会编译出错了。
第五题
两个错误:
首先,在一个?:表达式中,如果:两边的表达式的类型不一样,其值得类型为void。而一个void的值是不能被throw的。
其次,catch( int )在这里永远都不会执行到的,因为前面是catch(...)。
第六题
如果你在第一部分选择不会,该好好想一想了
好,如果i和j不是用户定义的类型,而是C++内建的类型,那答案又是什么??
答案是:
仍然可能会,因为++true的结果是true。(顺便说一句,--不能作用于bool类型的变量。)
第七题
都有问题。
下面这个实现可以解决问题。
class SomeClass
{
SomeClass()
{}
public:
static SomeClass* Instance()
{
static SomeClass* someClass;
if(someClass==NULL)
{
lock();
if(someClass==NULL)
someClass=new SomeClass();
unlock();
}
return someClass;
}
};
第八题
编译出错。
因为,throw的是值,没有多态的。而Base是一个虚类,自然不能以值的形式存在。
当然,有些编译器,譬如说VC6(唉,怎么又是它),可以编译通过,但是也会在运行时crash。
这是因为它强行创建了一个Base的对象,但是毕竟虚函数表上没这个函数,被catch(Base& b)抓住后,调用了Funny就crash了。
第九题
答案是:
编译错误。
前四行都没有问题,第五行有。因为编译器可不会把i+++++j自动的解释为(i++)+(++j),因为它每次总是试图提取尽量长的字符作为下一个token。这也是为什么intabcd会被解释成为一个表示符,而不是int abcd的原因。所以编译器会把i+++++j解释成为i++ ++ +j,于是就报错了。那么怎样解决这个问题呢,显而易见,用(i++)+(++j)可以。其实,更简单的方法是:加空格,把它变成i++ + ++j编译器就不会认错了。
第十题
0
注意,T(1)生成一个T的临时对象,而并不是像Java那样的调用另一个构造函数。
第十一题
编译错误。
main在C++里面是不能被重载的。
第十二题:以下程序有错吗?
没错,#单独出现,也是合法的预编译语句,只是没任何作用而以。
第十三题
错误。strtok是会保持状态的(具体请参考strtok的文档。)。所以,在库程序里,最好避免使用它。
如果你的用户在自己的程序里也在用strtok,并且调用你的类来做一些简单的字符替换,他会很悲哀的。
第十四题
有问题。因为,一个类要支持RTTI,至少必须有一个虚函数。否则,编译器可以不为他提供RTTI的信息。
第十五题
1 为什么呢??首先,D d2(d1)要调用的是D的copy构造函数。但是,D(const B& b)可不是D的copy构造函数。既然没有定义,那编译器会生成一个。而生成的那一个,会调用基类的copy构造函数。所以,答案是1。
浙公网安备 33010602011771号