前言
本节课重点讲的是析构函数 常函数 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)
{
}
};
模仿的这个也是浅拷贝
同一个类的多个对象,内存排布是一样的,地址不同