|
|
|
|
移动端

1.16.2 构造函数与析构函数(1)

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍构造函数与析构函数。

作者:猿媛之家来源:机械工业出版社|2017-12-06 18:41

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


1.16.2 构造函数与析构函数(1)

【真题 247】以下关于类的描述中,正确的是()。

A.每个类都有一个无参数的构造函数 B.每个类都有一个拷贝构造函数

C.每个类能有多个构造函数 D.每个类能有多个析构函数答案:C。构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。通常,构造函数具有以

下特点:

1)构造函数必须与类的名字相同,并且不能有返回值(返回值也不能为 void)。

2)每个类可以有多个构造函数。当开发人员没有提供构造函数的时候,编译器会提供一个无参数的构造函数,但该构造函数不会执行任何代码。如果开发人员提供了构造函数,那么编译器就不会再提供默认的构造函数了。

3)构造函数是可以重载的,也就是说,程序中可以定义多个有不同参数的构造函数。与构造函数相反的是析构函数,析构函数也是一个特殊的成员函数,它的名字是类名的前面加一个“~”符号:~类名 (),当对象的生命期结束时,会自动执行析构函数。从析构函数的定义可以看出,一个类只能有一个析构函数。对于本题而言,对于选项 A,当用户自定义一个有参数的构造函数的时候,编译器就不会再提供默

认的构造函数了,因此这个类就只有这一个有参数的构造函数。所以,选项 A错误。对于选项 B,一个类可以有多个拷贝构造函数,例如,有如下示例代码:

  1. class C  
  2. {  
  3. public:  
  4. C(const C&); //const 拷贝  
  5. C(C&); //非const 的拷贝  

所以,选项 B错误。

对于选项 C,由于构造函数可以重载,因此,可以定义多个构造函数。所以,选项 C正确。

对于选项 D,从析构函数的定义就可以看出,一个类只能定义一个析构函数(析构函数名是固定的,并且析构函数不能有参数)。因此,选项 D错误。

所以,本题的答案为 C。

【真题 248】以下关于析构函数的描述中,说法错误的是()。

A.析构函数有且仅有一个  B.析构函数和构造函数一样可以有形参

C.析构函数的功能是用来释放一个对象  D.析构函数无任何函数类型

答案:B。

构造函数有参数是为了初始化成员对象,而析构函数用于释放对象所占的空间,不需要参数也不能有参数。所以,选项 B错误。

【真题 249】有以下代码:

  1. A *pa = new A[10];  
  2. delete pa; 

则类 A的构造函数和析构函数分别执行了( )次。

A.1,1  B.10,10  C.1,10  D.10,1

答案:D。

new与 delete是 C++语言中预定的操作符,它们一般需要配套使用。 new用于从堆中申请一块空间,一般用于动态申请内存空间,即根据程序需要,申请一定长度的空间,而 delete则是将 new申请的内存空间释放。

具体而言,在使用 new创建对象的时候,会调用这个对象的构造函数。本题中,语句A *pa = new A[10]表示创建了 10个 A类型的对象,调用了 10次构造函数,数组一旦创建出来,指针 pa就指向了数组的首元素,在调用语句 delete pa的时候,只调用了 A[0]的析构函数,而对后面 9个对象没有调用析构函数,而这可能会导致内存泄漏(内存泄漏指的是分配函数动态开辟的空间在使用完毕后未释放,导致一直占据该内存单元,直到程序结束)。正确的调用方法应该是 delete[] pa,此时 10个对象的析构函数就都会被调用。因此,在使用 new的时候,必须把 new/delete和 new[]/delete[]配对使用。所以,选项 D正确。

【真题 250】有以下代码:

  1. class A { public: ~A(); }; A:: ~A() { printf("delete A "); }  
  2. class B :public A { public: ~B(); }; B:: ~B() { printf("delete B "); } 

那么执行以下代码:

  1. A *pa = new B();  
  2. delete pa; 

程序的输出结果是( )。

A.delete A  B.delete B  C.delete B delete A  D.delete A delete B

答案:A。

通常,程序在结束的时候会首先调用派生类的析构函数,然后再调用基类的析构函数。如果析构函数不是虚函数,而当程序执行时又要通过基类的指针去销毁派生类的动态对象,那么在用 delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全的后果。

对于本题而言,析构函数没有被定义为虚函数,而 pa是一个指向基类的指针,因此,在执行 delete pa语句的时候,只会调用基类的析构函数。所以,选项 A正确。

【真题 251】对于派生类的构造函数,在定义对象时,构造函数的执行顺序为()。

1:成员对象的构造函数

2:基类的构造函数

3:派生类本身的构造函数

A.123 B.231 C.321 D.213 答案:D。构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。构造函数具有以下特点:

1)构造函数名必须与类的名字相同,并且不能有返回值(返回值也不能为 void)。

2)每个类可以有多个构造函数。当开发人员没有提供构造函数的时候,编译器会提供一个没有参数、默认的构造函数,但该构造函数不会执行任何代码。如果开发人员提供了构造函数,那么编译器就不会再创建默认的构造函数了。

3)构造函数可以被重载,因此,一个类可以有多个构造函数。

4)构造函数的主要作用是完成对象的初始化工作。

5)构造函数不能被继承,但是构造函数能够被重载,可以使用不同的参数个数或参数类型来定义多个构造函数。

6)在类的继承关系中,当父类没有提供无参数的构造函数时,子类的构造函数中必须显式地调用父类的构造函数,如果父类中提供了无参数的构造函数,此时子类的构造函数就可以不显式地调用父类的构造函数,在这种情况下编译器会默认调用父类的无参数的构造函数。当有父类时,在实例化对象时会首先执行父类的构造函数,然后才执行子类的构造函数。

在继承关系中,当定义派生类对象时,构造函数的执行顺序如下:基类的构造函数→对象成员的构造函数→派生类的构造函数。

析构函数的执行顺序恰好和构造函数的执行顺序相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统会自动执行析构函数。如下例所示:

  1. #include <iostream.h> 
  2. using namespace std;  
  3. class C{  
  4. public:  
  5. C(){  
  6. cout << "C Construct" << endl;  
  7. }  
  8. ~C(){  
  9. cout << "C Deconstruct" << endl;  
  10. }  
  11. };  
  12. class Base {  
  13. public:  
  14. Base()  
  15. {  
  16. cout << "Base Construct\n";  
  17. }  
  18. ~Base()  
  19. {  
  20. cout << "Base Destruct\n";  
  21. }  
  22. };  
  23. class Derived : public Base {  
  24. private:  
  25. C c;  
  26. public:  
  27. Derived()  
  28. {  
  29. cout << "Derived Construct\n";  
  30. }  
  31. ~Derived()  
  32. {  
  33. cout << "Derived Destruct\n";  
  34. }  
  35. };  
  36. main()  
  37. {  
  38. //定义派生类对象  
  39. Derived obj;  

程序的运行结果为:

  1. Base Construct  
  2. C Construct  
  3. Derived Construct  
  4. Derived Destruct  
  5. C Deconstruct  
  6. Base Destruct 

所以,本题的答案为 D。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

J2ME手机游戏设计技术与实战

本书主要介绍了在手机上开发J2ME游戏的方法,作者在介绍了J2ME游戏开发相关知识背景的基础上,以大富翁手机游戏的设计开发为例,详细讲述了...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊