C++编码练习2
继续补充C++能量。。。
下面是今天做错的题,有几个未完全搞懂,待继续调查。
1. void ceshi(int a, int b = 7, char z = '*'); 下面的函数调用中,不合法的是:
(A)ceshi(5);
(B)ceshi(5,8);
(C)ceshi(5, '#');
(D)ceshi(0, 0, '#' )
2. 下边运行后结果是?
char str1[] = "qweqwe";
char str2[] = "qweqwe";
const char str3[] = "qweqwe";
const char str4[] = "qweqwe";
const char *str5 = "qweqwe";
const char *str6 = "qweqwe";
char *str7 = "qweqwe";
char *str8 = "qweqwe";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
(A) 1 1 0 0 (B) 0 0 1 1 (C) 1 0 0 1 (D) 0 1 1 0
3.下面结果是?
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
(A) 2, 2 (B) 2,4 (C) 2,5 (D) 2,1
4.
class A
{
public:
void output(int x){ cout << "A::output " << x << endl; }
};
class B: public A
{
public:
void output(float x){ cout << "B::output " << x << endl; }
};
void main(void)
{
B b;
A *pa = &b;
b.output(3.14f);
pa->output(3.14f);
}
上述代码执行后正确的输出是:
A)B::output 3.14
A::output 3
B)B::output 3.14
B::output 3.14
C)A::output 3
A::output 3
D)B::output 3.14
A::output 3.14
5. 先阅读以下代码
class A
{
public:
A(int i = 0) { cout << "A::A(int i = 0)" << endl; }
A(const A &a) { cout << "A::A(const A &a)" << endl; }
A& operator =(const A &a) { cout << "A::=(const A &a)" << endl ;
return *this;}
};
void main(void)
{
A a, b(2);
A c = b;
a = b;
}
上述代码执行后正确的输出是:
A)A::A(int i = 0)
A::A(int i = 0)
A::=(const A &A)
A::=(const A &A)
B)A::A(int i = 0)
A::A(int i = 0)
A::A(const A &a)
A::=(const A &A)
C)A::A(int i = 0)
A::=(const A &A)
A::=(const A &A)
D)A::A(int i = 0)
A::A(const A &a)
A::=(const A &A)
6. 有如下定义:
class A
{
public:
virtual void foo(void) { cout << "A::foo" << endl; }
};
class B : public A
{
public:
void foo(void) { cout << "B::foo" << endl; }
};
class C : public B
{
public:
virtual void foo(int) { cout << "C::foo" << endl; }
};
执行了以下语句
A* pA = new C;
pA->foo();
执行结果是?
(A) A::foo
(B) B::foo
(C) C::foo
(D) 编译失败;
答案是:C,B,C,A,B,B
个人理解:
1.答案C既能编译成功,也能运行成功。编码是最怕的就是这种,明明错了却悄无声息。
因为C中的char型会被当作int型传递给第二个参数。如果函数声明为void Test(int iData, int iD2 = 1, string C1 = NULL),调用时写为Test(0,"TEST");则编译不过,提示你第二个参数类型不匹配。所以得出结论,函数的默认参数是按照顺序来的,即使中间的参数有默认值也不会跳过。
2.其实str5,6,7,8都指向同一个地址,对于char* str5 = “qweqwe”;是在文字常量区分配了一块内存放“qeqwe”,然后再栈上分配一个地址给str5并指向这块内存。
str1,2,3,4还没完全搞懂待继续调查。http://blog.csdn.net/wallwind/article/details/7210474
3.没有完全搞明白,但是猜测int *ptr=(int *)(&a+1);将ptr指向了数组的后边一位,而*(ptr-1)就指向了数组的最后一位。待调查。。。
4.因为A中的output(int x)并不是虚函数。所以上转型对象没有调用B中的函数。(很基础的东西,而我现在差的就是将基础的东西咬死。突然联想到公司招聘就像个人去商场买电器,花里胡哨的功能一大堆,但是买回来可能有些功能用不上,但是这些少了哪个功能买家都会觉得亏。。。
不同的是,电器不能挑买家,但是码农可以挑老板,唉!让我身上没用到的功能再多一些吧。。。)
5.至于A c = b;为什么调用构造函数,a = b;为什么调用运算符函数。。。谁会?给我讲讲。(貌似老板给我的工资已经很高了。。。)
6.因为B中的foo(void)不是虚函数所以A* pA = new C;从A找下去到达B就截止了。如果是实际项目中,这样产生BUG的概率很高啊。。。