• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2021-08-01 13:00 Aet 隐藏边栏 |   抢沙发  5 
文章评分 1 次,平均分 5.0

类中的类类型静态成员变量

概述

  1. 对于类类型的静态成员变量,即使没有被使用,也会执行这个静态成员变量的构造和析构。
  2. 对于int,double基础类型,如果没有用到,编译器可能不为它分配内存。

使用

老用法

C++17

函数中的类类型静态对象

概述

  1. 如果函数没有被调用过,该静态对象就不会被构造。
  2. 如果函数被调用了多次,该静态对象也只会被构造一次。

全局对象的构造顺序

  1. 如果一个项目中有多个源文件,每个源文件中都定义了一些不同的全局对象,这些全局对象的构造顺序(或初始化顺序)是不确定的。

拷贝构造函数和拷贝赋值运算符

对象自我赋值可能导致的问题

如果对于上面的实现,发生了自己赋值自己,就会有问题

方法一:在赋值的时候,判断是不是自己

方法二:利用额外的空间进行处理

继承关系下的拷贝构造函数和拷贝赋值运算符

这时类B和类A没有什么区别,所以不会有问题

当派生类定义了自己的拷贝构造和拷贝赋值运算符之后,就不会调用基类的拷贝构造函数和拷贝赋值预算符了:

需要主动调用基类的拷贝构造函数和拷贝辅助运算符

程序退出时检测内存泄漏并输出到“输出”窗口

public继承

  1. 表现出的是一种“is-a”关系。
    1. 其中,基类表现的是一种更泛化的概念,而子类表现的是一种更特化的概念。
    2. 能够在基类对象上做的行为也能够在派生类对象上做,因为每个派生类对象都是一个基类对象。
  2. 设计模式的里氏替换原则,任何基类出现的地方都能够无差别的使用子类替换。

组合关系

  1. A对象里面有一个B对象成员,它们有一样的生命周期。

聚合关系

  1. A对象里面用到了B对象的指针,B对象的指针可以在需要的时候传过来,所以生命周期是可以不一致的。

不支持拷贝构造和拷贝赋值运算符的类

方法一

方法二:将拷贝构造函数和拷贝赋值运算符设为私有,并不予以实现

方法三:

避免将基类的虚函数暴露给派生类

所谓非虚拟接口手法

关于在构造和析构中调用虚函数

  1. 构造B的时候,会先走到A的构造里面去,这时,B还没有完成构造出来,此时在A的构造中调用了一个虚函数f1,那么调用的只能是A自己的f1了。
  2. 然后走到B的构造里面,这是B类对象已经完成构造了,在B的构造里面调用了一个f1,此时,根据虚函数机制,对象类型是B,所以调用的f1是B的。
  3. 然后调用了f1,f2,这时调用的都是B的。
  4. 最后析构对象的时候,先走B的析构函数,此时,虚函数机制还是起作用的,调用到的f2是B的
  5. 然后才走到A的析构函数,此时对象B的那部分已经被析构掉了,此时调用了一个虚函数f2,调用到的只能是A自己的f2了。

关于析构函数的访问权限

  1. 如果一个基类的析构函数不是虚函数,并且也不利用这个基类来创建对象,也不会用到这个基类类型的指针,则应该考虑将这个基类的析构函数设为受保护的。
  2. 比如设为protected之后:
    1. 无法创建基类对象
    2. 无法让基类指针执行基类或派生类的对象(因为无法成功delete)

模拟抽象类

  1. 抽象类至少要有一个纯虚函数。
  2. 抽象类不能用来生成对象。

关于隐式转换(类型转换构造函数)

强制类对象不能在堆上分配内存

强制类对象只能在堆上分配内存

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2021-11-20
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享