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的概率很高啊。。。

 

转载于:https://www.cnblogs.com/JerryloveAda/p/4426032.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值