类定义
有两种方式:
一是在类内声明时同时实现,
另一种是在类内声明函数原型、在类外实现
类内定义的成员函数默认为内联函数
类外实现减少编译依赖 减少编译依赖并清晰地分离接口与实现
初始化
显式初始化和隐式初始化
声明 定义 初始化 --初始值的来源
单个变量而言,初始化表示现在创建一个新的变量,它的初始值来自一个已经存在的对象,即原来没有值,现在第一次给它一个初值就叫初始化
赋值是两个变量已经有值的情况下,将一个变量值去替换另一个变量值
类对象:
类对象的拷贝初始化 是调用 拷贝构造函数来完成的
类对象的赋值操作 是调用类的拷贝赋值运算符 说“=”运算符 进行了重载
先定义再赋值
定义的同时赋值
拷贝初始化 看起来像是给变量赋值,实际上是执行了初始化操作
初始化器列表构造函数初始化(initializer-list constructor)
成员初始器列表(constructor initialize list)以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式
变量
内置类型变量(如int,double,bool等),
如果定义在语句块外(即{}外),则变量被默认初始化为0;
如果定义在语句块内(即{}内),变量将拥有未定义的值。
对象:
对象初始化是创建对象并为其分配内存空间的过程
两个步骤:分配内存和构造对象
分配内存是指为对象分配所需的内存空间,
而构造对象是指初始化对象的成员变量和调用构造函数。
编译器自动调用构造函数进行隐式初始化。
对象的生命周期取决于它的作用域和存储方式
动态分配内存的方式(即不采用new运算符)
初始化器(即使用了圆括号或花括号
直接初始化与拷贝初始化
当创建一个无名临时对象 创建一个有名称的对象
T();
T{};
new T();
new T{};
析构函数
何时调用析构函数:
1.对象生命周期结束时,会自动执行析构函数。
析构函数不返回任何值,没有返回类型,也没有函数参数。由于没有函数参数,因此它不能被重载。
换言之,一个类可以有多个构造函数,但是只能有一个析构函数。
2.如果用new运算动态地建立一个对象,那用delete运算符释放该对象时,才会调用析构函数
3.广义上讲,析构函数的作用并不仅仅限于释放资源方面,它可以执行任意操作,
用来执行“对象即将被撤销之前程序员所期待的任何操作。
三个成员函数缺一不可:析构函数、复制构造函数、赋值运算符
原因:普通构造函数是通过赋值操作来初始化,就会有可能存在生成临时成员对象的问题
构造函数-python 比较
python:构造函数(Constructor)
在Python中,构造函数的名称是__init__ 构造函数在类实例化时自动执行
根据需求创建适合的构造函数来初始化对象的属性
必须包含参数self作为第一个参数,self参数是一个指向实例本身的引用,用于访问类中的属性和方法
Python认为子类和父类是同等的对象,
只是子类继承父类后,会保留父类的方法和成员,是否覆盖取决于他自己
派生类调用基类,则是在派生类中使用super().__init__()
成员函数需要被手动调用,而构造函数在创建对象的过程中是自动被调用的
同一个对象而言,成员函数可以被调用多次,但是,构造函数只能被调用一次
C++ C++中的先调用父类初始化再调用子类初始化方法的现象。
C++认为子类是父类生的,所以父类必须存在而且先存在