C++面试题-面向对象-构造函数和析构函数

问:构造函数与析构函数是什么?区别是什么?

答:

构造函数:每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。构造函数的任务是初始化对象的数据成员,构造函数最重要的作用是创建对象本身。

析构函数:析构函数初始化对象的非static数据成员,还可能做一些其他工作;析构函数释放对象使用的资源,并销毁对象非static数据成员。由于析构函数没有参数,所以它不能被重载。

无论何时一个对象被销毁,就会自动调用其析构函数(以下是销毁的部分):

  1. 变量在离开其作用域时被销毁。
  2. 当一个对象被销毁式,其成员被销毁。
  3. 容器(无论是标准库容器还是数组)被销毁时,其元素被销毁。
  4. 对于动态分配的对象,当对指向它的指针应用delete运算符时被销毁。
  5. 对于临时对象,当创建它的完整表达式结束时被销毁。

区别:

  1. 构造函数可以有参数,所以可以被重载。析构函数没有参数,所以不可以被重载。
  2. 在构造函数中,成员初始化实在函数体执行之前完成的,且按照它们在类中出现的顺序进行初始化。在一个析构函数中,首先执行函数体,然后销毁成员,成员按初始化顺序的逆序销毁。
  3. 在一个构造函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,析构部分是隐式的。成员销毁时发生什么完全依赖于成员的类型。销毁类类型的成员需要执行成员自己的析构函数。内置类型没有析构函数,因此销毁内置类型成员什么也不需要做。

问:当子类继承父类,由创建子类的实例到释放时,构造函数和析构函数的调用顺序?

答:当创建子类实例时,先调用父类的构造函数,再调用子类的构造函数。当要释放子类的对象时,先调用子类的析构函数,再调用父类的构造函数来销毁对象。

问:什么情况下,把析构函数设置为私有时?

答:自己只调用自己的时候。只允许创建堆对象的时候。

如果在栈上分配空间,类在离开作用域时会调用析构函数释放空间,此时无法调用私有的析构函数。

如果在堆上分配空间,只有在delete时才会调用析构函数。目的是在堆中,可以自由控制对象的生命周期。

问:当构造函数设置为私有时,该怎么创建对象?

答:在类里面定义一个static成员函数,在该函数里面调用私有的构造函数。因为静态成员函数就可以不通过对象而直接被调用。

例如:A是类名,Instance是静态函数:

public:

static A& Instance()

{

static A a;

return a;

}

int main(int argc, char** argv)

{

A& ra = A::Instance();

ra.Print();

}

还有一个情况是:通常将拷贝构造函数和operator=(赋值操作符重载)声明成private,但是没有实现体。

这个的目的是禁止一个类的外部用户对这个类的对象进行复制动作。

问:构造函数和析构函数设置为protected时,作用是什么?

答:如果你不想让外面的用户直接构造一个类(假设这个类的名字为A)的对象,而希望用户只能构造这个类A的子类,那你就可以将类A的构造函数/析构函数声明为protected,而将类A的子类的构造函数/析构函数声明为public。

问:构造函数可不可以是虚函数?

答:不可以。因为虚函数表是通过初始化才可以有分配的内存,而恰好创建对象初始化数据成员以及创建虚函数表时,是通过构造函数的。如果构造函数是虚函数,那虚函数表是从哪里来呢。

问:析构函数是属于虚函数吗?

答:析构函数可以是虚函数,也可以不是虚函数。在类没有继承的时候,可以不设置为虚函数,在子类继承父类的时候,必须设置为虚函数,因为销毁资源时,如果子类的实例没有调用自己的析构函数,就会发生内存泄漏。所以一般情况下,当子类继承了父类,该析构函数是虚函数。

问:下面关于CNode类的定义有何错误?

class CNode

{

public:

CNode *pNext;

CNode()

{

pNext = this;

}

~CNode()

{

if (pNext != NULL)

{

delete pNext;

pNext = NULL;

}

}

};

答:出现了递归调用。在析构函数中执行“delete pNext”语句时导致递归,因为调用“delete pNext”语句将致使~CNode()析构函数被调用。

分析:析构函数由系统自动调用。有两种情况将导致析构函数被调用:一是对象的作用域消失,二是使用delete运算符释放对象。本题中就是使用delete运算符释放对象。但是本题中是在析构函数中使用delete运算符释放自身,这将导致再次调用析构函数。

问:什么是复制构造函数?

答:复制构造函数也称为拷贝构造函数,当函数或方法包含有类对象作为参数时,在函数或方法调用时,将调用复制构造函数构建对象。复制构造函数有固定的语法格式,名称与类同名,参数类型是当前的常量引用类型。

问:什么是转换函数?

答:类型转换函数是指用转换构造函数可以将一个指定类型的数据转换为类的对象。

问:假定A为一个类的类名,则该类的复制构造函数的函数原型是()。

A.A&(A x);     B.(A x);     C.A(const A &x)      D.A(A*x);

答:C

问:复制构造函数在哪些情况下会被自动调用?

答:将类对象作为函数或方法参数时,将调用复制构造函数。此外,如果将类对象作为函数或方法返回值,也将调用复制构造函数。

问:请完成下面代码实现main()函数中的类型转换(不能使用运算符重载)?

class CPerson

{

public:

int m_nAge;

CPerson()

{

m_nAge = 0;

}

};

void main(void)

{

CPerson person = 10;//将该语句合法化

}

答:通过构造函数来实现类型转换。修改CPerson类的构造函数,使其包含一个整数作为参数。例如:

CPerson(int Age)

{

m_nAge=Age;

}

问:C++中的explicit关键字有何作用?

答:explicit关键字的作用是禁止将构造函数作为转换函数。例如,如果一个类的构造函数中只包含一个整数参数,在构造函数前使用explicit关键字可以阻止像"CPerson person=10;”这样的语句执行。

问:比如类为A,请举例写出利用默认构造函数和重载构造函数创建对象的语句。

答:

默认构造函数:A a;

重载函数:A a(1,2);

C++面试题-面向对象-构造函数和析构函数相关推荐

  1. 头歌Educoder实验:C++ 面向对象 - 构造函数与析构函数

    第1关:构造函数 -- 学生信息类 任务描述 本关任务:设计一个带有构造函数和析构函数的学生类. 相关知识 构造函数.析构函数与赋值函数是每个类最基本的函数.他们太普通以致让人容易麻痹大意,其实这些貌 ...

  2. php中类的构造函数和析构函数,php面向对象-构造函数和析构函数详解

    php面向对象中构造函数(__construnct)和析构函数详解(__destruct) //在实际运用中构造函数的作用可以用来给属相初始化值,或初始化操作,话不啰嗦,例子更能形象说明: class ...

  3. 头歌--C++ 面向对象 - 构造函数与析构函数

    目录 第1关:构造函数 -- 学生信息类 任务描述 相关知识 编程要求 测试说明

  4. 头歌:C++ 面向对象 - 构造函数与析构函数

    第一题: #include<iostream> #include<string> using namespace std;class Student { public: int ...

  5. C++中构造函数和析构函数常见面试题?

    构造函数和析构函数常见面试题? 构造函数和析构函数常见面试题? 1.永远不要在构造函数或析构函数中调用虚函数 2.为什么构造函数不能定义为虚函数 3.为什么析构函数可以定义为虚函数 4.构造函数的执行 ...

  6. python在删除对象时会自动调用析构函数_Python面向对象程序设计构造函数和析构函数用法分析...

    本文实例讲述了Python面向对象程序设计构造函数和析构函数用法.分享给大家供大家参考,具体如下: 构造函数和析构函数 1.构造方法的使用 很多类都倾向于将对象创建为有初始化状态.因此类可以定义一个名 ...

  7. 【C++碎碎念】面向对象(封装与访问控制、构造函数与析构函数、拷贝函数)

    目录 一.封装与访问控制 二.构造函数与析构函数 三. 拷贝构造函数 一.封装与访问控制 1.封装的优势: 1)隐藏实现细节,提供公共的访问方式: 2)提高了代码的复用性: 3)提高了安全性. 2.分 ...

  8. C++面试题-面向对象-面向对象概念

    C++面试题-面向对象-面向对象概念 问:说说C++和C的主要区别? 答: C语言属于面向过程语言,通过函数来实现程序功能.而C++是面向对象语言,主要通过类的形式来实现程序功能. 使用C++编写的面 ...

  9. C++面试题-面向对象-多态性与虚函数

    C++面试题-面向对象-多态性与虚函数 问:在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"? 答:C++语言支持函数重载,C语言不支持函数重载.函数被C+ ...

最新文章

  1. myisam表锁及锁粒度调节
  2. react redux学习之路
  3. 按照指定字符(@split )分割字符串,并取第@index 个
  4. PHP strcasecmp函数
  5. 设置Backup-masters Hbase中只有一个HMaster ,hmaster挂掉了,客户端还能连接hbase集群进行数据读写吗
  6. Java 网络实例三(获取URL响应头的日期信息、获取URL响应头信息、解析URL、ServerSocket和Socket通信实例)
  7. w8服务器dns修改,Win8.1系统的DNS地址如何修改?修改win8.1系统DNS地址图文教程
  8. markdown文档中利用Mathpix Snip软件插入公式
  9. antd下拉框联动说明
  10. 神舟 linux背光驱动,【linux】暂时解决sis m672(神舟F4000 D9) linux驱动 宽屏分辨率的问题?...
  11. bada打地鼠应用程序简介
  12. 生物信息学_测序技术(一)DNA测序
  13. chm文件无法打开,chm电子书显示“此程序无法显示网页”的解决办法
  14. CrossAir CA-S01 SMD贴片天线使用步骤
  15. 如何强制关闭mac后台程序
  16. mockjs的安装使用
  17. 软件设计师-系统开发与软件工程
  18. 一站到底名人堂成员_综艺节目数风流人物,还看《一站到底》“名人堂”!
  19. 移动的台风:论matplotlib和cartopy配合的地图动画漫游
  20. vscode插件vetur,vue3 setup下vetur调整

热门文章

  1. C++ 继承与组合的区别
  2. 70. Climbing Stairs【leetcode】递归,动态规划,java,算法
  3. 小问题420_1_hibernateTemplate.update不执行
  4. 20145321 《信息安全系统设计基础》第12周学习总结
  5. 跨平台通信中间件thrift学习【Java版本】(转)
  6. java并发编程基础-ReentrantLock及LinkedBlockingQueue源码分析
  7. Spring依赖处理过程源码分析
  8. es管理kabina_ES和Kibana在Linux上的安装
  9. 分类算法之邻近算法:KNN(应用篇)
  10. 常用的组播保留地址列表