【面试】C++类中的相关函数【构造,拷贝构造,析构,友元】
构造函数:值的初始化,可带参数,无返回值,可重载,可存在多个
析构函数:释放对象内存空间,无参数,无返回值,不可重载,只能存在一个
拷贝构造函数:拷贝对象,其形参必须是引用
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++类中的相关函数【构造,拷贝构造,析构,友元】的更多相关文章
- C++ //构造函数的分类及调用 //分类 // 按照参数分类 无参构造函数(默认构造) 有参构造函数 //按照类型分类 普通构造 拷贝构造
1 //构造函数的分类及调用 2 //分类 3 // 按照参数分类 无参构造函数(默认构造) 有参构造函数 4 //按照类型分类 普通构造 拷贝构造 5 6 #include <iostream ...
- C++派生类的拷贝构造
一. 概述 通过几个简单的实验,回顾下派生类中拷贝构造的相关知识. 环境:Centos7 64位, g++ 4.8.5 在继承中,构造器与析构器均没有被继承下来.拷贝构造,也是一种构造,也没有被继承下 ...
- C++解析(16):友元与类中的函数重载
0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...
- C++类中函数(构造函数、析构函数、拷贝构造函数、赋值构造函数)
[1]为什么空类可以创建对象呢? 示例代码如下: #include <iostream> using namespace std; class Empty { }; void main() ...
- C++类中的一些细节(重载、重写、覆盖、隐藏,构造函数、析构函数、拷贝构造函数、赋值函数在继承时的一些问题)
1 函数的重载.重写(重定义).函数覆盖及隐藏 其实函数重载与函数重写.函数覆盖和函数隐藏不是一个层面上的概念.前者是同一个类内,或者同一个函数作用域内,同名不同参数列表的函数之间的关系.而后三者是基 ...
- Java面试系列第2篇-Object类中的方法
Java的Object是所有引用类型的父类,定义的方法按照用途可以分为以下几种: (1)构造函数 (2)hashCode() 和 equals() 函数用来判断对象是否相同 (3)wait().wai ...
- C++类中一个构造函数调用另一个构造函数
class A { int a; int b; int c; public: A(int aa, int bb) : a(aa), b(bb),c(0) { cout << "a ...
- Java类中代码的执行顺序 静态代码块>构造代码块>构造方法
一:静态代码块 注意是代码块,不是静态函数.函数要调用才执行,代码块加载就执行,一般是静态变量的声明与初始化.被static修饰的代码块(赋值.输出操作等).类中静态语句块仅在类加载时被执行一次 如 ...
- C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)
from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...
随机推荐
- .Net Core 遇到 “'windows-1252' is not a supported encoding name.”
使用iTextSharp生成Pdf文件时报错如下: 'windows-1252' is not a supported encoding name. For information on defini ...
- SpringCloud组件Eureka
什么是微服务架构 架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异步通信,独立部署)是分布式概念的跟严格执行SOA到微服务架构的演进过程作用:各服务 ...
- 封装原生promise函数
阿里面试题: 手动封装promise函数 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- RSDS pdb格式
本描述了“RSDS”或“DS”类型的pdb(程序数据库)文件的格式,这些文件是由Miscrosoft的link.exe从版本7及更高版本发出的. 什么是PDB文件? 如果选择了/DEBUG选项或/DE ...
- BZOJ4241 历史研究 【回滚莫队】
题目描述:给出一个长度为\(n\)的数组,每次询问区间 \([l,r]\),求 \(\max\limits_{x}x*cnt_x\),其中 \(cnt_x\) 表示 \(x\) 在区间 \([l,r] ...
- Xilinx ISE中使用Synplify综合报错的原因
在Xilinx ISE中使用Synopsys Synplify 综合比较方便,但有时会出现如下错误: "ERROR:NgdBuild: - logical block ' ' with ty ...
- 从Word到Latex文档
有时,从Word文档复制到Latex文档时会编译报错,这时要检查某些特殊字符.中文输入法下的字符有时无法正确编译,要用相应的英文输入法下的字符替代.拉丁字母.希腊字母应该用转义字符实现.
- PCA与ICA
关于机器学习理论方面的研究,最好阅读英文原版的学术论文.PCA主要作用是数据降维,而ICA主要作用是盲信号分离.在讲述理论依据之前,先思考以下几个问题:真实的数据训练总是存在以下几个问题: ①特征冗余 ...
- mysql addtime() 函数
mysql> select addtime('1997-12-31 23:59:52' , '1 1:1:1'); +-------------------------------------- ...
- 如何更改sdk版本