代码改变世界

迅雷100题:逻辑运算和类

2011-06-13 15:50  x_feng  阅读(230)  评论(0编辑  收藏  举报

image

答案:A,!x++,!和++的优先级相同,但是是右结合的,相当于!(x++)。

image

答案:B,其实我觉得每个都对,如果非要计较B中while(a<=10)后面少个“;”号的话。

image

答案:B。类的内联可以在类内和类外定义

image

答案:D。A)static数据成员不可以在类内初始化,只能在类外初始化,格式:

<数据类型><类名>::<静态数据成员名>=<值>,除非是const static 类型的数据成员可以在类内初始化(当然一些老的编译器还是不支持),const或static都不能直接在类内初始化,但是const可以在成员初始化列表中初始化,而static不行。B)如果static数据成员是public,当然可以用类的对象调用。C)如B static数据成员是public才可以用对象直接调用,私有的不行,static受public/private影响。D)引用格式:<类名>::<静态成员名>

/*

static成员是类的组成部分但不是任何对象的组成部分,因此static成员函数没有this指针。因为static成员不是任何对象的组成部分,所以static成员函数不能被声明为const,毕竟将成员函数声明为const就是承诺不会修改该函数所属的对象,最后static成员函数也不能被声明为虚函数

*/

image

答案:C。C++要求赋值= 下标[] 调用() 和成员访问箭头-> 操作符必须被定义为类成员操作符任何把这些操作符定义为名字空间成员的定义都会被标记为编译时刻错。

无标题

不能被重载的操作符:::    .*    .   ?:  4个

image

答案:C,运行时的多态只能通过虚函数实现

image

答案:A

image

答案:C。因为>的优先级比=高,所以先判断a>b,结果为false,所以m=false,由于是&&判断,前面已经为false后面的就不做判断了。

所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其它的都是从左至右结合

具有最高优先级的其实并不算是真正的运算符,它们算是一类特殊的操作。()是与函数相关,[]与数组相关,而->及.是取结构成员。

其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的 真正的运算符中它们具有最高的优先级,又由于它们都是从右至左结合的,因此*p++与*(p++)等效是毫无疑问的。

运算符(优先级从高到低)                                                                      结合性
  ++(后缀) --(后缀) ( )(调用函数) [] {} (组合文字) . –>                              从左到右
  ++(前缀) --(前缀) -+~! sizeof * (取值) &(地址) (type) (都是一元运算)  从右到左
  (type name)                                                                                     从右到左
  * / %                                                                                              从左到右
  + -(二者都是二元运算)                                                                         从左到右
  << >> 从左到右
  < > <= >= 从左到右
  == != 从左到右
  & 从左到右
  ^ 从左到右
  | 从左到右
  && 从左到右
  || 从左到右
  ?:(条件表达式) 从右到左
  = *= /= %= += -= <<= >>= &= |= ^= 从右到左
  ,(逗号运算符) 从左到右

image

答案:C。

image

答案:D。

image

答案:A

image

答案:D。定义重载运算符如同定义一个函数,该函数的名字为operator@。其中@表示运算符。

参数个数取决于两个因素:

1、运算符是一元的还是二元的。

2、运算符被定义为全局(一元一个参数,二元两个参数)的还是成员函数(一元没有参数,二元一个参数,对象变为左侧参数)。

而友元是全局的。另:

成员运算符与非成员运算符的选择:成员运算符:所有的一元运算符、&=、|=、%=、>>=、<<=、+=、-+、*=、/=。必须成员运算符:=、()、[]、->。非成员:所有其他二元运算符。

image

答案:D。F(X,Y)后面的都是F(X,Y)的内容,在调用的地方全部展开

image

答案:A。i=j=0,不是条件运算符,但是赋值操作返回的值为0,就相当于判断结果为false,没有循环,如果改为i=j=1,就是无限循环了。如果是i=j=-1呢?也是无限循环

image

答案:B。C和D有同样的错误,p2只是一个指针,没有志向任何一个地址,也就无从得到*p2的值以及给*p2赋值。

image

答案:B。当k能被11整除时结束,k%11只要不被整除,返回的就是大于0,while条件为真,继续。

image

答案:B。

image

答案:D。

image

答案:A。

image

答案:C。“指向类成员的指针”这个描述中有“指针”这个术语,其实,这是不合适的,因为它们既不包含地址,行为也不像指针。声明一个指向成员的指针:int classname::*p;p是一个指向类classname的int型的指针。

如:class C{ public :int x;},定义一个指向类成员的指针:int C::*p; C c;这里赋值也有些不同:int C::*p = &C::x;不能用int C::*p = &c.x;

详见:http://yanguohong0925.blog.163.com/blog/static/92869842010101792546108/

http://www.blogjava.net/codefans/articles/20034.html

image

这个是不是写错了,fun前面没有返回类型,不知道怎么选。

image

答案:C。

image

答案:D。

image

答案:C。

image

答案:D。

image

答案:B。

image

答案:A。

(还没整理完,今晚7点要上火车了,以后再传…)

image

答案:C。

image

答案:C。

image

答案:D。

image

答案:C。对于B b(a);是如何执行的呢?首先B中有A _a;要出现A的构造函数,然而b(a);相对于对_a进行初始化,要调用A的拷贝构造函数,但是A中没有定义,所以没有输出。本来是:A,A的拷贝构造函数,B,~B,~A,~A。

image

答案:B。注意A _a(a);A _a = a; (A _a; _a = a)的区别,前者是一样的,后者其实先调用默认的构造函数,然后调用赋值构造函数。

image

答案:A。

image

答案:B

image

答案:B。

image

答案:A。A b=a;相对于初始化,而不是赋值。

image

答案:C。

image

答案:A。说真的,实在不想知道为啥这样,真的很无聊。

image

答案:A。A a1 = 10;首先10不是A的对象,这是编译器或生产一个临时的对象A::A(10)来对a1初始化,说以只调用了拷贝构造函数。

image

答案:B。A a1;调用一个构造函数,10生成一个临时对象,临时对象赋值给a1调用赋值构造函数。

image

答案:D。这里如果改为class B: virtual public A呢?采用虚继承,sizeof(B)?答案为16=sizeof(A)+4(虚继承指向A的指针)+sizeof(B).

(好了,就这些吧,还有一小部分,有兴趣的可以去查一下。如有错误的地方,烦请告知,谢谢。)