前言
本节课重点讲的是析构函数 常函数 static成员
提示:以下是本篇文章正文内容,下面案例可供参考
一、析构函数
作用:清理工作
比如用new给成员申请了空间,析构函数可以释放掉
调用时间决定其主要作用
与构造函数对比:调用时间 定义对象--->构造函数--->内存释放时--->析构函数
形式如下:
~类名() { }
注意:不能有参数,返回值,返回值类型,没有重载,
默认析构函数:什么都不做,类比默认构造函数
几种调用:
//局部对象:作用域结束调用析构 Students stu; //临时对象:所在语句结束调用析构 Students(); //指针对象 Students* pstu = new Students(); delete pstu;//调用析构函数
有人会说:申请指针对象能不能用malloc和free呢?
我的回答是:不能,看下
malloc 和 new的区别
new会触发构造函数,malloc不会
free 和delete区别
delete会触发析构函数,free不会
class Students { public: Students() { cout << "Student 构造函数" << endl; } ~Students()//比构造函数后执行 { cout << "Student 析构函数" << endl; } };
二、常函数
形式
void fun()const{;}//在参数列表后加const
注意:构造函数和析构函数不可以是常函数
使用:
和const变量一样,只能使用类内成员,不能修改他
对函数的功能有更明确的限定
特点:
常函数的this指针是 const CStu*
常对象只能调用常函数,不能调用普通函数
代码如下:
class Students { public: int age; Students() { age = 18; cout << "Student 构造函数" << endl; } void fun() const { cout << age << endl;//√ //age = 19;//× } };
三、static
形式:
static int a; static void fun() { }
使用方式
对象调用
类名作用域
int Students::age = 188; Students::fun(); //或者 Students stu1; stu1.age; stu1.fun();
静态成员
类外初始化
无static
静态常量整型数据成员可以直接进行初始化
static const float a = 13.12f;
不行
static const int a = 13.12f;
整型
不使用循环,来一个自加1
静态成员函数
无this
不能调用非静态成员,可以调用静态成员
可以作为一种指挥该类所有对象的作用
属于类的属性,不是对象,即所有对象共有一个
可以通过类名调用
可以通过对象调用
静态函数成员注意:
只能使用static的成员变量和成员函数
为什么呢?因为static的变量和函数都是在一开始就声明好的,在static的函数中去调用还没有的变量和函数,怎么使用?static的变量就可以使用,因为他们是一起创建的
四、浅拷贝
浅拷贝,拷贝一些不是指针的变量
形式
Students(Students &stu) { }
实际上就是构造函数
参数是本类的常引用
调用时机
CStu a;//声明一个对象 1、CStu a1(a);//临时对象 2、CStu a3 = CStu(a);//临时对象赋值 3、CStu* a4 = new CStu(a);//指针对象 //注意:赋值是不会的 CStu s; CStu p; s = p;
2.当程序生成对象副本时
函数参数传递对象的值
函数返回对象
有什么功能:
默认的复制构造函数,逐个复制非静态成员(成员的复制称为浅复制)值,复制的是成员的值
系统默认的这个又叫浅拷贝
实践一下,模仿一下默认的
class Students { public: Students() { cout << "Student 构造函数" << endl; } Students(Students&stu) { } };
模仿的这个也是浅拷贝 同一个类的多个对象,内存排布是一样的,地址不同