【C++】类内成员析构函数 常函数 static的介绍 浅拷贝

举报
人才程序员 发表于 2023/11/30 17:54:39 2023/11/30
【摘要】 @TOC 前言本节课重点讲的是析构函数 常函数 static成员提示:以下是本篇文章正文内容,下面案例可供参考 一、析构函数作用:清理工作比如用new给成员申请了空间,析构函数可以释放掉调用时间决定其主要作用与构造函数对比:调用时间定义对象--->构造函数--->内存释放时--->析构函数形式如下:~类名(){}注意:不能有参数,返回值,返回值类型,没有重载,默认析构函数:什么都不做,类比默...

@TOC


前言

本节课重点讲的是析构函数 常函数 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)
	{
	}
};
	模仿的这个也是浅拷贝
同一个类的多个对象,内存排布是一样的,地址不同
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。