c++题目

内容出自http://blog.csdn.net/cadcisdhht,感谢原创作者的汗水。

 

题目(1:运行下图中的C++代码,输出是什么

#include<iostream>

class A

{

private:

       int n1;

       int n2;

public:

       A(): n2(0), n1(n2 + 2)

       {

       }

       void Print()

       {

               std::cout << "n1: " << n1 << ", n2: " << n2 << std::endl;

       }

};

int _tmain(int argc, _TCHAR* argv[])

{

       A a;

       a.Print();

       return 0;

}

答案:输出n1是一个随机的数字,n20。在C++中,成员变量的初始化顺序与变量在类型中的申明顺序相同,而与它们在构造函数的初始化列表中的顺序无关。因此在这道题中,会首先初始化n1,而初始n1的参数n2还没有初始化,是一个随机值,因此n1就是一个随机值。初始化n2时,根据参数0对其初始化,故n2=0

题目(2编译运行下图中的C++代码,结果是什么?(A)编译错误;(B)编译成功,运行时程序崩溃;(C)编译运行正常,输出10。请选择正确答案并分析原因

#include<iostream>

class A

{

private:

       int value;

public:

       A(int n)

       {

               value = n;

       }

       A(A other)

       {

               value = other.value;

       }

       void Print()

       {

               std::cout << value << std::endl;

       }

};

int _tmain(int argc, _TCHAR* argv[])

{

       A a = 10;

       A b = a;

       b.Print();

       return 0;

}

答案:编译错误。在复制构造函数中传入的参数是A的一个实例。由于是传值,把形参拷贝到实参会调用复制构造函数。因此如果允许复制构造函数传值,那么会形成永无休止的递归并造成栈溢出。因此C++的标准不允许复制构造函数传值参数,而必须是传引用或者常量引用。在Visual StudioGCC中,都将编译出错。

题目(3运行下图中的C++代码,输出是什么

int SizeOf(char pString[])

{

       return sizeof(pString);

}

int _tmain(int argc, _TCHAR* argv[])

{

       char* pString1 = "google";

       int size1 = sizeof(pString1);

       int size2 = sizeof(*pString1);

       char pString2[100] = "google";

       int size3 = sizeof(pString2);

       int size4 = SizeOf(pString2);

       printf("%d, %d, %d, %d", size1, size2, size3, size4);

       return 0;

}

答案4, 1, 100, 4pString1是一个指针。在32位机器上,任意指针都占4个字节的空间。*pString1是字符串pString1的第一个字符。一个字符占一个字节。pString2是一个数组,sizeof(pString2)是求数组的大小。这个数组包含100个字符,因此大小是100个字节。而在函数SizeOf中,虽然传入的参数是一个字符数组,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针。

题目(4:运行下图中代码,输出的结果是什么?这段代码有什么问题

#include<iostream>

class A

{

public:

       A()

       {      std::cout << "A is created." << std::endl;       }

       ~A()

       {      std::cout << "A is deleted." << std::endl;       }

};

class B :public A

{

public:

       B()

       {      std::cout << "B is created." << std::endl;       }

       ~B()

       {      std::cout << "B is deleted." << std::endl;       }

};

int _tmain(int argc, _TCHAR* argv[])

{

       A* pA = new B();

       delete pA;

       return 0;

}

答案:输出三行,分别是:A is created. B is created. A is deleted。用new创建B时,回调用B的构造函数。在调用B的构造函数的时候,会先调用A的构造函数。因此先输出A is created. B is created.

接下来运行delete语句时,会调用析构函数。由于pA被声明成类型A的指针,同时基类A的析构函数没有标上virtual,因此只有A的析构函数被调用到,而不会调用B的析构函数。

由于pA实际上是指向一个B的实例的指针,但在析构的时候只调用了基类A的析构函数,却没有调用B的析构函数。这就是一个问题。如果在类型B中创建了一些资源,比如文件句柄、内存等,在这种情况下都得不到释放,从而导致资源泄漏。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值