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

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

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

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. 【模板】A*B Problem(FFT快速傅里叶)

    题目:给出两个n位10进制整数x和y,你需要计算x*y.($n \leq 60000$) 分析: 两个正整数的相乘可以视为两个多项式的相乘, 例如 $15 \times 16 = 240$, 可写成 ...

  2. 用 ThreadPoolExecutor/ThreadPoolTaskExecutor 线程池技术提高系统吞吐量(附带线程池参数详解和使用注意事项)

    1.概述 在Java中,我们一般通过集成Thread类和实现Runnnable接口,调用线程的start()方法实现线程的启动.但如果并发的数量很多,而且每个线程都是执行很短的时间便结束了,那样频繁的 ...

  3. 纯js制作九宫格

    Demo实现了对任意方格进行拖拽,可以交换位置,其中Demo-1利用了勾股定理判断距离! Demo-1整体思路: 1.首先div实现自由移动,一定需要脱离标准文档流,所以我们给它使用绝对定位. 2.利 ...

  4. callbag js callback 标准-支持轻量级观测以及迭代

    callbag 是一个js 的回调标准,方便开发支持观测以及迭代的代码 类似已经有好多的实现了 callbag-basics 比rxjs 以及xstream 还快 wonka 说明 基于标准的开发,对 ...

  5. Linux 系统管理——引导过程与服务控制

    一. 系统引导流程 1.开机自检(BIOS)(基本的输入输出系统) 2.MBR引导1.2. MBRIS 当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中MBR (Master Boot Record ...

  6. 算法:贪心、回溯(su)、分治、动态规划,思想简要

    贪心算法: 只做出当前看来最好的选择,而不从整体考虑最优,他所作出的是局部最优解.使用该算法的前提是必须具备无后效性,即某个状态以前的选择不会影响以后的状态的选择,只与当前状态有关. 回溯算法: 本质 ...

  7. GoCN每日新闻(2019-10-19)

    GoCN每日新闻(2019-10-19) Go 1.13中的错误处理 https://tonybai.com/2019/10/18/errors-handling-in-go-1-13 golang核 ...

  8. Go-Json操作

    /** * @Author: jadeshu * @Description: * @File: main * @Version: 1.0.0 * @Date: 2019/11/7 2:33 */ pa ...

  9. Kubernetes kubectl 命令概述

    kubectl用于运行Kubernetes集群命令的管理工具. 语法 kubectl [command] [TYPE] [NAME] [flags] command:指定要在一个或多个资源执行的操作 ...

  10. 软件工程--团队项目选择与NABCD

    目录 Part1:项目说明 项目基础 我们的目标 Part2:项目NABCD Need Approach Benefit Competitors Delivery & Data Deliver ...