当前位置: 首页 > news >正文

华清远见25072班C++学习day4

重点内容:

类中特殊的成员函数:

构造函数:

初始化列表:

        构造函数的本身工作是完成类对象申请空间的,而初始化工作是由初始化列表来完成的。

        初始化列表是由构造函数的形参小括号后面由冒号引出。

格式:

        类名(形参1,形参2,形参3,...,形参n):成员变量1(形参1),成员变量2(形参2),成员变量3(形参3),...,成员变量n(形参n) { 函数体内容; }

注意:只有构造函数才有初始化列表,其他函数没有初始化列表。

类的嵌套

        当存在类的嵌套时,调用构造函数的顺序:

                1、先调用成员的构造函数

                2、再调用自己的构造函数

析构函数

功能

        当类对象的生命周期结束后,会自动调用析构函数,来完成类对象的资源回收。

格式

        ~类名() { 函数体内容; }

调用时机

        1、栈区==>类对象所在的函数结束后,会自动调用析构函数

        2、堆区==>何时使用delete, 何时自动调用析构函数

注意:

        1、系统会默认提供一个析构函数,如果程序员手动定义了,则系统取消默认提供。

        2、每个类中只能有一个析构函数。(原因:析构函数无参,不能重载)

        3、当类中有指针成员,并且该指针指向了堆区空间,此时需要将系统提供的析构函数显性定义出来,在析构函数中手动将指针成员所申请的堆区空间释放,否则会造成内存泄漏。

拷贝构造函数

功能

        拷贝构造函数是一种特殊的构造函数,用一个类对象给另一个类对象初始化使用的。

格式

        类名(const 类名 &other) { 函数体内容; }

调用时机

        1、用一个类对象给另一个类对象初始化使用的,就会自动调用拷贝构造函数。

        2、当类对象作为函数参数,传递给形参的过程,就会自动调用拷贝构造函数

        3、当函数返回一个类对象时,就会自动调用拷贝构造函数。

浅拷贝和深拷贝

1、系统会默认提供一个拷贝构造函数,如果程序员手动定义,则系统取消默认提供。

2、系统提供的拷贝构造函数,将一个对象的所有数据成员初始化另一个对象的所有数据成员,称为浅拷贝。

拷贝赋值函数

功能

        一个类对象赋值给另一个类对象。==>本质:运算符重载

格式

        类名 &operator=(const 类名 &other) { 函数体内容; }

调用时机

        一个类对象赋值给另一个类对象

注意:

        1、类中都有系统提供的拷贝赋值函数,将一个类对象的所有数据成员赋值给另一个对象的所有数据成员,如果程序员手动定义,则系统取消默认提供

        2、拷贝赋值函数也存在深浅拷贝问题

        浅拷贝:系统提供的拷贝构造函数/拷贝赋值函数,就是浅拷贝,将一个类对象的所有数据成员赋值给另一个对象的所有数据成员

        深拷贝:将系统提供的拷贝赋值或者拷贝构造显性定义出来,将指针成员自己申请一片空间,将另一个对象指针指向里的值,赋值到刚刚申请的空间中。


作业:

1>设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函数、析构函数和拷贝构造函数、拷贝赋值函数。

程序源码:

#include <iostream>
using namespace std;
class Per
{
private:string name;int age;double *height;double *weight;
public://无参构造函数Per(){cout<<"Per::无参构造函数"<<endl;}//有参构造函数Per(string name,int age,double height,double weight):name(name),age(age),height(new double(height)),weight(new double(weight)){cout<<"Per::有参构造函数"<<endl;}//深拷贝构造函数Per(const Per &other):name(other.name),age(other.age),height(new double(*(other.height))),weight(new double(*(other.weight))){cout<<"Per::拷贝构造函数"<<endl;}//析构函数~Per(){delete height;height = nullptr;delete weight;weight = nullptr;cout << "Per::析构函数" << endl;}//拷贝赋值函数Per &operator=(const Per &other){//避免自己给自己赋值if(this != &other){this->name = other.name;this->age = other.age;this->height = new double(*(other.height));this->weight = new double(*(other.weight));}cout << "Per::拷贝赋值函数" << endl;return *this;  // *this == 对象}void show(){cout<<name<<" "<<age<<" "<<" "<<*height<<" "<<*weight<<endl;}
};class Stu
{
private:double score;Per p1;
public://无参构造函数Stu(){cout<<"Stu::无参构造函数"<<endl;}//有参构造函数Stu(double score,string name,int age,double height,double weight):score(score),p1(name,age,height,weight){cout<<"Stu::有参构造函数"<<endl;}// 拷贝构造函数Stu(const Stu& other):score(other.score),p1(other.p1){cout << "Stu::拷贝构造函数" << endl;}// 拷贝赋值函数Stu& operator=(const Stu& other){if (this != &other){p1 = other.p1;score = other.score;}cout << "Stu::拷贝赋值函数" << endl;return *this;}// 析构函数~Stu(){cout << "Stu::析构函数" << endl;}void show(){p1.show();cout<<"score="<<score<<endl;}
};
int main()
{Per person1;cout<<"==========================="<<endl;Per person2("wcg1",23,100,100);person2.show();cout<<"==========================="<<endl;Per person3(person2);person3.show();cout<<"==========================="<<endl;Per person4;person4=person3;person4.show();cout<<"==========================="<<endl;Stu stu1;Stu stu2(88.8,"wcg2",20,200,200);stu2.show();cout<<"==========================="<<endl;Stu stu3(stu2);stu3.show();cout<<"==========================="<<endl;Stu stu4;stu4=stu3;stu4.show();cout<<"==========================="<<endl;return 0;
}

2>思维导图

http://www.dtcms.com/a/424401.html

相关文章:

  • Springboot集成Flowable
  • 使用langgraph创建工作流系列5:创建一个服务
  • 【MyBatis】MyBatis 报错:Parameter ‘xxx‘ not found
  • GBDT分类树原理(下):回归树构建与叶子节点值的推导
  • mysql的配置步骤
  • 三轴云台之控制反馈技术
  • 多光营销软件网站多少钱要交个人所得税
  • 知识图谱三强争霸:Neo4j/LightRAG/GraphRAG 全方位 PK 及实战适配指南
  • 网站 php 源码有没有做面粉美食的网站
  • 丹东黄页网靖江网站优化
  • 马鞍山建设集团有限公司网站东莞市长安镇做网站
  • 吴中区网站建设泰安网络公司排行榜
  • TDengine 时序函数 MAVG 用户手册
  • 红帽RH134知识复习(2)
  • 大圣网站建设wordpress点播主题
  • 邵阳汽车网站建设郑州seo服务公司
  • ASP.NET的编程入门与应用介绍
  • 网站核验单怎么下载网站个别页面做seo
  • 宁波海曙网站开发个人如何开发微信小程序
  • 门户网站建设 突出服务Wordpress 视频采集插件
  • stm32l476 adc数据无法采集,开启ASRC,解决方式
  • 厦门建设网站企业网站优化建设山东
  • 【大模型理论篇】AI原生应用的关键要素之上下文工程
  • Java应用实例:密码合法性判断(换行符消耗与判断条件拓展)、打印完数(静态方法应用)
  • 编译原理-期末重点知识总结 电子科技大学
  • Spark小说数据分析与推荐系统 Hadoop 机器学习 爬虫 协同过滤推荐算法 Hive 大数据 毕业设计(源码+文档)✅
  • 星外网站开发wordpress主题投稿
  • frp做网站阿里云 域名 做网站
  • 网站空间速度深圳seo优化项目
  • 如何使用天翼云主机建设网站cms开源