构造函数与析构函数

构造函数:  它是函数,主要是用来构建对象,用来初始化成员变量.
构造函数基本不主动调用.系统调用.如果没有构造函数无法构造对象,如果没有提供构造函数,系统会自动给生成一个默认的构造函数.

注意: 默认的构造函数没有参数.

调用时机: 当需要创建对象的时候
在构建对象的时候,直接在对象后加小括号来调用不同的构造函数
例如: students hello(18,2);

构造函数定义:没有返回值不可以写void,函数名就是类名,参数随意.

复制构造函数(拷贝构造函数)

拷贝构造.通过一个已经构造的对象,构造一个新的对象出来.
形式: 类名(类名& 对象名){xxxx};
注意:如果提供了有参数的构造,还得提供一个默认构造.
1.拷贝构造同样的函数名和类名相同,必须传入相同类型对象的引用.
2.如果没有提供拷贝构造函数,系统会自动提供,如果提供后系统不再提供.
3.默认提供的形参只会拷贝内容值(只会拷贝指针值),另个对象会使用同一个内存空间,
释放是会释放两次,导致问题出现,所以对于类中new的内存,在拷贝构造的时候需要重新申请内存,后者叫做深拷贝.

组合关系:
在类中还有其他对象
形式:class a{ 其他类名 对象名; 其他类名 对象名}
构建: 先定义的先构建,后定义的后构建.
如果其他类提供缺省的构造函数,在当前类的构造函数中可以不写其他类的构造
如果其他类没有提供缺省构造,则必须在当前类的构造初始化列表中主动调用.


特殊成员变量:
const 成员变量 ; 必须在初始化列表中进行初始化.
引申出: 初始化列表----在构造函数最后面加上冒号,加上括号的方式例如students() :m_age(18){} 初始化列表在构造函数之前执行
static 静态成员变量,不属于某一个对象,属于整个类的,只可以在类外进行初始化,创建多个对象,只有一份内存空间,每个对象都可以去修改静态成员变量的值.
static变量的使用: 类名::变量名

const 函数
特点: 没法修改成员变量的值,只可以访问成员变量
不可以调用非const成员函数.
案例: int fun()const{}

析构函数:
当对象创建之后,如果不需要了,程序员需要跟踪,不使用了需要释放.
作用: 在对象释放时调用,也是系统调用,不可以主动调用
如果没提供析构函数,系统默认提供析构.
如果提供了,系统析构函数失效.
样式: 没有返回值,函数名是类名前加~,没有参数.
~student(){xxxx}
调用时机: 静态对象----整个程序结束时析构
局部对象----当函数结束时
new的对象---调用delete时会调用析构
注意:对象的存储是在栈中,所以对象的释放是先释放后创建的对象.

原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/8344028.html