构造函数:值的初始化,可带参数,无返回值,可重载,可存在多个

析构函数:释放对象内存空间,无参数,无返回值,不可重载,只能存在一个

拷贝构造函数:拷贝对象,其形参必须是引用

1.空类会默认添加哪些东西?怎么写?空类的大小是多少?为什么?

1)Empty():默认构造函数

2)Empty(const Empty&):拷贝构造函数

3)~Empty():析构函数

4)Empty& operate=(const Empty&):赋值运算符

空类的大小为1,因为C++要求类的每个实例必须具有独一无二的地址,编译器自动为空类分配一个字节的大小,这样保证了每个实例具有独一无二的内存地址

2.构造函数的执行顺序?析构函数的执行顺序

构造函数:

1)父类构造函数,如果有多个父类,则这些父类的构造函数的调用顺序为父类在子类中出现的顺序

2)成员类对象构造函数,如果有多个成员类,则这些成员类的构造函数调用顺序为成员类在类中被声明的顺序

3)子类构造函数

析构函数:

1)子类析构函数

2)成员类对象的析构函数

3)父类的析构函数

3.构造函数和析构函数中可以抛异常吗?

不建议在构造函数中抛异常,不可以在析构函数中抛异常!

1)在构造函数中抛异常,将会导致析构函数不被执行,会造成内存泄漏,需要手动去释放内存或者采用auto_ptr智能指针:因为构造函数中抛出异常会默认构造函数没有执行完毕,析构函数也就不会被调用,从而内存泄漏

2)在析构函数中抛异常,异常的处理又是调用异常对象的析构函数,这样会陷入无穷的递归中,所以必须把异常封装在析构函数的内部,而不是将异常抛出去

4.类成员的初始化方式?哪种更快?为什么?

1)赋值初始化:在构造函数中做赋值操作,是在数据成员分配好内存空间之后再进行赋值操作

2)列表初始化:在冒号后使用初始化列表,是在数据成员分配内存空间时就进行初始化

列表初始化更快:赋值操作会产生临时对象,临时对象的出现会降低程序效率

5.如何阻止编译器自动生成拷贝构造函数和赋值函数并且避免被调用?

1)将拷贝构造函数和赋值函数手动重写并且设置为privte,且只进行声明不予实现

手动重写可以避免编译器默认生成,设置为private可以避免被外部类或子类调用,只声明不实现可以在本类的成员函数和友元函数调用时产生连接错误

2)继承Uncopyable类

Uncopyable类的拷贝构造函数和赋值运算符都是私有的,不会被子类调用,从而可以阻止拷贝和对象赋值

3)手动重写并且将函数定义为deleted函数:deleted函数为禁止调用函数

6.什么情况下会生成默认构造函数?

1)类成员含有构造函数时:为了能够调用类成员的构造函数,所以本类必须要有构造函数

2)父类中含有构造函数时:为了能够调用父类的构造函数,所以子类必须有构造函数才能调用父类的构造函数,才能初始化父类成员

3)类中含有虚函数时:对象的虚函数表指针需要通过构造函数进行初始化

4)虚继承时:指向虚基类的指针要在构造函数中被初始化

构造函数只有在被需要时才会自动生成!

编译器生成构造函数和拷贝构造函数的情况是一样的,也就是说编译器合成拷贝构造函数也是在上面四种情况下

7.类的析构函数什么时候会被调用?

1)对象生命周期结束时

2)delete指向对象的指针时,或delete指向对象的基类类型指针,而基类析构函数是虚函数时

3)对象A是对象B的成员,B的析构被调用时,A的析构函数也会被调用

8.为什么友元函数必须在类的内部进行声明?

因为编译器在编译类的时候就必须知道谁可以访问类的私有部分!所以友元函数必须在类的内部进行声明,可以在类的外部进行定义!

【面试】C++类中的相关函数【构造,拷贝构造,析构,友元】的更多相关文章

  1. C++ //构造函数的分类及调用 //分类 // 按照参数分类 无参构造函数(默认构造) 有参构造函数 //按照类型分类 普通构造 拷贝构造

    1 //构造函数的分类及调用 2 //分类 3 // 按照参数分类 无参构造函数(默认构造) 有参构造函数 4 //按照类型分类 普通构造 拷贝构造 5 6 #include <iostream ...

  2. C++派生类的拷贝构造

    一. 概述 通过几个简单的实验,回顾下派生类中拷贝构造的相关知识. 环境:Centos7 64位, g++ 4.8.5 在继承中,构造器与析构器均没有被继承下来.拷贝构造,也是一种构造,也没有被继承下 ...

  3. C++解析(16):友元与类中的函数重载

    0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...

  4. C++类中函数(构造函数、析构函数、拷贝构造函数、赋值构造函数)

    [1]为什么空类可以创建对象呢? 示例代码如下: #include <iostream> using namespace std; class Empty { }; void main() ...

  5. C++类中的一些细节(重载、重写、覆盖、隐藏,构造函数、析构函数、拷贝构造函数、赋值函数在继承时的一些问题)

    1 函数的重载.重写(重定义).函数覆盖及隐藏 其实函数重载与函数重写.函数覆盖和函数隐藏不是一个层面上的概念.前者是同一个类内,或者同一个函数作用域内,同名不同参数列表的函数之间的关系.而后三者是基 ...

  6. Java面试系列第2篇-Object类中的方法

    Java的Object是所有引用类型的父类,定义的方法按照用途可以分为以下几种: (1)构造函数 (2)hashCode() 和 equals() 函数用来判断对象是否相同 (3)wait().wai ...

  7. C++类中一个构造函数调用另一个构造函数

    class A { int a; int b; int c; public: A(int aa, int bb) : a(aa), b(bb),c(0) { cout << "a ...

  8. Java类中代码的执行顺序 静态代码块>构造代码块>构造方法

    一:静态代码块 注意是代码块,不是静态函数.函数要调用才执行,代码块加载就执行,一般是静态变量的声明与初始化.被static修饰的代码块(赋值.输出操作等).类中静态语句块仅在类加载时被执行一次 如 ...

  9. C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)

    from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...

随机推荐

  1. np.mean()函数

    1. 数组的操作: import numpy as np a = np.array([[1, 2], [3, 4]]) print(a) print(type(a)) print(np.mean(a) ...

  2. [CSS] prefers-reduced-motion

    The prefers-reduced-motion CSS media feature is used to detect if the user has requested that the sy ...

  3. 关于new FormData() 对象的用法

    formData.append()  理论上本身若键值已经存在,那么我们append的数据是进行类似push的操作,为了匹配php,我们进行加了[]  ,这个操作.!

  4. zabbix server内存突然飙升

    2019年10月16日22:20:58 十点二十突然内存占满,top查询一个httpd进程占了79%,查询httpd.error.log发现 [Wed Oct 16 10:24:57.578643 2 ...

  5. 微众银行Java面试-社招-一面(2019/07)

    个人情况 2017年毕业,普通本科,计算机科学与技术专业,毕业后在一个二三线小城市从事Java开发,2年Java开发经验.做过分布式开发,没有高并发的处理经验,平时做To G的项目居多.写下面经是希望 ...

  6. QML学习(一)——<简要概念知识点>

    转载:https://www.cnblogs.com/dengyg0710/p/10644936.html 1.一个 QML 文档有且只有一个根元素. 2.QML 元素名后所有内容使用 {} 包围起来 ...

  7. nRF51822 硬件复位引脚

    nRF51822 有一个硬件复位引脚和Debug 口SWDIO是共用的,名字叫做nReset. 实现硬件复位是怎样子的: 1.这个引脚引出来, 2.给这个引脚低电平, 3.从低电平拉到高电平,即复位. ...

  8. VUE中常用的十大过滤器

    在vue的学习过程中,我发现过滤器是一个很好用的工具,过滤器(Filters)来渲染数据是一种很有趣的方式.过滤器不能替代Vue中的methods.computed或者watch,不改变真正的data ...

  9. centos7安装mysql8 ERROR! The server quit without updating PID file

    原因mysql的安装目录在/etc/my.cnf配置不正确或者目录中的文件没有权限导致的,或者日志目录没有权限导致的 使用chwon -R mysql:mysql  mysql的日志目录后重启mysq ...

  10. CTF 文件上传

    目录 一.客户端校验 1.禁用JS 2.抓包改包 二.服务端校验 1.MIME类型检测 2.后缀名黑名单校验 3.后缀名白名单校验 4.内容头校验 5.竞争上传 6.过滤<?或php 两种校验方 ...