Linux 学习记录42(C++篇)

news2025/1/11 17:59:08

Linux 学习记录42(C++篇)

在这里插入图片描述

本文目录

  • Linux 学习记录42(C++篇)
  • 一、class 类
    • 1. 类中的this指针
      • (1. this指针的格式
      • (2. 使用this指针
    • 2. 类中特殊的成员函数
      • (1. 构造函数
        • >1 格式/定义
        • >2 调用构造函数的时机
        • >3 构造函数的初始化列表
      • (2. 析构函数
        • >1 功能/格式
        • >2 析构函数的调用时机
        • >3 需要显性调用析构函数情况
        • >4 定义和使用
      • (3. 拷贝构造函数
        • >1 格式
        • >2 调用时机
        • >3 定义和使用
        • >4. 深/浅拷贝
      • (4. 拷贝赋值函数
        • >1 格式
        • >2 定义
        • >3. 深/浅拷贝
    • 3. 匿名对象
      • (1.使用场景
      • (2. 定义
    • 4. 类的大小
  • 思维导图
  • 练习

@

一、class 类

1. 类中的this指针

类内默认提供给非静态成员函数的this指针,指针指向类对象本身,哪个对象调用成员函数,this就指向哪个对象

(1. this指针的格式

格式:类名* const this; //不能改变this的指向

(2. 使用this指针

1. 如果函数的形参和成员属性同名时,需要使用this指针解决
2. 拷贝赋值函数中,需要返回自身的引用,也需要使用this指针解决
class Rectangle
{
private://私有的成员属性/方法
    int a;
public://公有的成员属性/方法
    void set_a(int a)
    {
"在这里函数的参数a和类中的a变量名重复所以无法确定到底是那个变量,所以需要用到this指针"
        a = a;
    }

protected://受保护的成员属性/方法
};
============================修改后如下================================
class Rectangle
{
private://私有的成员属性/方法
    int a;
public://公有的成员属性/方法
    void set_a(int a)
    {
         this->a = a;
    }
protected://受保护的成员属性/方法
};

2. 类中特殊的成员函数

如果程序员不手动定义,系统会默认提供的函数,系统默认提供的是无参构造

1. 构造函数 (常用)
2. 析构函数 (常用)
3. 拷贝构造函数 (常用)
4. 拷贝赋值函数 (常用)
5. 取地址运算符重载函数
6. 常取地址运算符重载函数
7. C++11新增:移动构造函数
8. C++11新增:移动赋值函数

(1. 构造函数

使用情景:
1. 形参和成员属性同名
2. 类内有引用成员,必须使用初始化列表
3. 类内有const修饰的成员时,必须使用初始化列表
4. 类中包含其他类的的子对象时,其他类必须初始化时,需要使用初始化列表

>1 格式/定义

用于实例化类对象时,系统自动调用

功能:实例化类对象时,给类对象开辟空间和初始化
格式:类名(形参列表)
{
	函数体;
}
例:
class test
{
private://私有的成员属性/方法
    int a;
    string b;
    double c;
public://公有的成员属性/方法
    /*有参构造和无参构造构成函数重载*/
    test(int a,string b,double c)
    {   //有参构造
        this->a=a;
        this->b=b;
        this->c=c;
    }
    test()
    {
        //无参构造
    }
protected://受保护的成员属性/方法
};

int main()
{
    test p;
    test p1(1,"abc",1.23);
    return 0;
}

>2 调用构造函数的时机

构造函数一般是public权限的

  1. 在栈区

什么时候实例化对象,什么时候调用构造函数,系统默认调用

  1. 在堆区申请空间

什么时候用new申请空间,什么时候调用构造函数

>3 构造函数的初始化列表

构造函数提供了初始化列表的机制,在函数体外

格式: 类名(形参列表):成员属性1(参数1),成员属性2(参数2),成员属性3(参数3)...
{
	函数体
}
例:
class test
{
private://私有的成员属性/方法
    int a;
    string b;
    double c;
public://公有的成员属性/方法
    /*有参构造和无参构造构成函数重载*/
    test(int a,string b,double c):a(a),b(b),c(c)
    {   //有参构造
        /*函数体内的赋值
        this->a=a;
        this->b=b;
        this->c=c;*/
    }
protected://受保护的成员属性/方法
};

(2. 析构函数

>1 功能/格式

功能:在类对象消亡时回收类对象的空间

格式:
~类名()
{
	函数体
}

>2 析构函数的调用时机

先构造的后析构

  1. 在栈区:

系统在对象消亡时,主动调用

  1. 在堆区:

使用delete关键字,释放空间时,主动调用析构函数

>3 需要显性调用析构函数情况

1. 系统会默认析构函数,在对象消亡时,主动调用,释放对象的空间
2. 析构函数不允许函数重载
3. 当类中有指针成员(指向堆区申请的空间)时,

>4 定义和使用

析构函数不支持重载

class test
{
private://私有的成员属性/方法
    int a;
    int* p;
    string b;
    double c;
public://公有的成员属性/方法
    /*析构函数,会自动调用*/
    ~test()
    {
        /*释放指针指向的堆区空间地址*/
        delete p;
        p = nullptr;
    }
protected://受保护的成员属性/方法
};

int main()
{
    test* p = new test;
    delete p;
    return 0;
}

(3. 拷贝构造函数

使用已有类对象给新的类对象初始化时,会自动调用拷贝构造函数

>1 格式

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

>2 调用时机

1. 使用已有的类对象给新的类对象初始化的时候,主动调用拷贝构造函数
2. 类对象作为函数的形参,主动调用拷贝构造函数
3. 类对象作为函数的返回值,主动调用拷贝构造函数

>3 定义和使用

class test
{
private://私有的成员属性/方法
    int num;
    string str;
public://公有的成员属性/方法
    test()
    {//无参构造函数
    }
    test(test &other)
    {//拷贝构造函数
        num = other.num;
        str = other.str;
    }
protected://受保护的成员属性/方法
};

int main()
{
    test p1;//定义一个p1变量
    test p2 = p1;//将p1拷贝一份给p2
    return 0;
}

>4. 深/浅拷贝

如果类内有指针成员,涉及到深浅拷贝问题

  1. 浅拷贝

两个不同类对象的指针成员指向同一片空间,会造成一个类对象对其修改另一个类对象的值也会修改

  1. 深拷贝

两个不同类对象的指针成员指向不同的空间,一个类对象的修改不会影响另一个类对象的值。


(4. 拷贝赋值函数

使用一个类对象给另一个类对象赋值时使用的,适于运算符重载

>1 格式

运算符重载的函数名:operator=

类名 &(const 类名 &引用)
{
	函数体;
}
拷贝赋值函数会返回自身的引用

>2 定义

class test
{
private://私有的成员属性/方法
    int num;
    string str;
public://公有的成员属性/方法
    test()
    {
    }
    test &operator=(test &other)
    {
        num = other.num;
        str = other.str;
        return *this;//返回自身
    }
protected://受保护的成员属性/方法
};

>3. 深/浅拷贝

拷贝赋值函数依然需要考虑深浅的问题,但是不需要再申请空间
要保证指针成员指向的地址在堆区才能delete释放

using namespace std;

class test
{
private://私有的成员属性/方法
    int num;
    int* p;
    string str;
public://公有的成员属性/方法
    test()
    {
    }
    test(int a,int* b,string c):num(a),p(b),str(c)
    {
    }
    test &operator=(test &other)
    {
        cout << "拷贝赋值" <<endl;
        *p = *(other.p);//深拷贝
//        p = other.p;//浅拷贝
        num = other.num;
        str = other.str;
        return *this;//返回自身
    }
    void show(void)
    {
        cout << "p=" << p <<endl;
        cout << "num=" << *p <<endl;
    }
    ~test()
    {
        cout << "空间已释放" <<endl;
        delete p;
        p = nullptr;
    }
protected://受保护的成员属性/方法
};

int main()
{
    int num1 = 1;
    int num2 = 2;
    test buf1(num1,&num1,"buf1");
    test buf2(num2,&num2,"buf2");

    buf1.show();
    buf2.show();

    buf1 = buf2;
    cout << "--------" <<endl;

    buf1.show();
    buf2.show();

    return 0;
}

3. 匿名对象

匿名对象就是实例化对象时,没有实例名的对象,它的生命周期短,是一个临时值

(1.使用场景

使用场景:
1. 用作全局函数的临时传参
2. 使用临时对象给另一个类对象赋值
3. 临时使用成员方法
4. 类对象数组

(2. 定义

class test
{
private://私有的成员属性/方法
    int num;
    int* p;
    string str;
public://公有的成员属性/方法
    test(int a,int* b,string c):num(a),p(b),str(c)
    {
    }
protected://受保护的成员属性/方法
};

int main()
{
    int num1 = 1;
    test (num1,&num1,"buf1");//这里就实例化了一个匿名对象
    return 0; 
}

4. 类的大小

类的大小和结构体的大小是一致的,类中的函数在声明时也是不占用空间的
string类型 在64位占32个字节,32位占24字节(QT内)

string类型包含以下几个部分(QT中)
1. 指向字符数组的指针
2. 字符串的实际长度 size_t
3. 字符串能存储的最大长度
4. 系统能存储的最大长度

思维导图

在这里插入图片描述

练习

#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdio>

using namespace std;

class Person
{
private:
    int age;
    int *p;
public:
    //无参构造
    Person():p(new int(89))
    {
        age = 18;
    }
    //有参构造
    Person(int age,int num)
    {
        this->age = age;
        this->p=new int(num);
    }
    //拷贝构造函数
    Person(Person &other)
    {
        age = other.age;
        p = new int (*(other.p));//深拷贝
//        p = other.p;//浅拷贝
    }
    //拷贝赋值函数
    Person operator=(Person &other)
    {
        age = other.age;
        *p = *(other.p);//深拷贝
//        p = other.p;//浅拷贝
        return *this;
    }
    //析构函数
    ~Person()
    {
        delete p;
        p = nullptr;
    }
};

int main()
{

    return 0;
}




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/701284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis的数据复制到另一台Redis

Redis的数据复制到另一台Redis 最近用到一个问题&#xff0c;需要把Redis的数据复制到另一台Redis&#xff0c;现在总结下解决问题的方法 解决方法一&#xff1a; redis-dump导出 [root ~]# redis-dump -u :password172.20.0.1:6379 > 172.20.0.1.jsonredis-load导入 [ro…

快速打造属于你的接口自动化测试框架

目录 1 接口测试 2 框架选型​​​​​​​ 3 环境搭建 4 需求 5 整体实现架构 6 RF用例实现​​​​​​​ 7 集成到CICD流程 总结&#xff1a; 1 接口测试 接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程…

Redis 高可用 RDB AOF

---------------------- Redis 高可用 ---------------------------------------- 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境…

基于Java人力资源管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

webassembly简单Demo——hello world

参考官网 Emscripten Tutorial 一、创建C/C文件 hello.c #include <stdio.h>int main() {printf("hello, world!\n");return 0; } 二、编译成html 命令行切到hello.c目录下&#xff0c;执行如下命令(注意需要em的环境变量&#xff0c;参考&#xff1a;emsr…

5G AI MEC智能制造数字化工业互联网大数据平台建设方案PPT

导读&#xff1a;原文《102页新一代数字化转型信息化总体规划方案PPT》共102页PPT&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&…

ARM-进入和退出异常中断的过程(六)

文章目录 ARM 处理器对异常中断的响应过程从异常中断处理程序中返回 ARM 处理器对异常中断的响应过程 ARM 指令为三级流水线&#xff1a;取地&#xff0c;译码和执行 进入中断的时候 LR PC -4 当出现异常时&#xff0c;ARM 内核自动执行以下操作 将 cpsr 寄存器的值保存到…

走近JDK 17,探索最新Java特性,拥抱未来编程!

大家好&#xff0c;我是小米&#xff0c;一个热爱技术分享的程序员。今天&#xff0c;我将为大家介绍一下JDK 17的新特性。JDK 17是Java开发工具包的一个重要版本&#xff0c;其中包含了许多令人激动的新功能和改进。在这篇文章中&#xff0c;我将详细介绍JDK 17中的各项特性&a…

Mathtype7Mac苹果ios简体中文版

对于很多人来说&#xff0c;每次编辑文字的时候遇到公式简直就是噩梦。像那些复杂的数学、物理还有化学公式&#xff0c;太难编辑出来了。 那么我们该怎么解决这些难题呢&#xff1f;其实很简单&#xff0c;用公式编辑器就行了。 公式编辑器&#xff0c;是一种工具软件&#…

前端开发爬虫首选puppeteer

很多前端同学可能对于爬虫不是很感冒&#xff0c;觉得爬虫需要用偏后端的语言&#xff0c;诸如 python 、php 等。当然这是在 nodejs 前了&#xff0c;nodejs 的出现&#xff0c;使得 Javascript 也可以用来写爬虫了。但这是大数据时代&#xff0c;数据的需求是不分前端还是后端…

基于Java会议管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

DSP f32 q15 q31 数据格式

+ V hezkz17进数字音频系统研究开发交流答疑 f32 q15 q31 分别代表什么数据格式? 2023/6/29 17:38:47 "f32"、"q15"和"q31"是不同的数据格式表示法: f32:它代表32位浮点数。在这种表示法中,32位被用来表示带有小数点的实数。其中,1位用于…

MySQL阿里巴巴规约

MySQL阿里巴巴规约 1.MySQL阿里巴巴规约【转载】 1.MySQL阿里巴巴规约【转载】

一步一步学OAK之十一:实现在RGB相机上进行对象跟踪

目录 Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4:定义和加载模型相关的路径和标签Setup 5: 创建pipelineSetup 6: 创建节点Setup 7: 设置属性设置相机属性设置神经网络节点属性设置物体跟踪对象属性 Setup 8: 建立链接Setup 9: 连接设备并启动管道Setup …

剑指 Offer 33: 二叉搜索树的后序遍历序列

这道题运用的后序遍历一个很重要的性质&#xff1a;最后一个值是根节点&#xff0c;并且二叉搜索树的性质使得右子树的数全都大于左子树。 这里有三个重要的地方&#xff0c; 第一个是当Start值大于等于End&#xff08;即为只有一个节点时&#xff0c;此时已经满足条件&#xf…

Revit中用自适应创建简单的瓦片族和切换构件的材质?

一、Revit中使用自适应创建瓦片族 在我们的日常生活中&#xff0c;屋顶的瓦片是我们经常都能够见到的&#xff0c;瓦片能够挡风遮雨也能够使建筑物带来古香古色的气息&#xff0c;那我们今天来学习如何使用自适应创建简单的瓦片族。 1.首先&#xff1a;我们打开自适应公制常规模…

usb转rs232全隔离设计参考

参考 CN-0373 特此记录 anlog 2023年6月29日

css基础(四)

目录 一、CSS 定位 1.1 为什么需要定位 1.2 定位组成 1.3 静态定位static&#xff08;了解&#xff09; 1.4 相对定位relative&#xff08;重要&#xff09; 1.5 绝对定位absolute&#xff08;重要&#xff09; 1.6 子绝父相的由来 1.7 固定定位fixed&#xff08;重要&#xff…

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver 异常解决

目录 问题 原因 解决 今天在开发一个DB同步工具的时候&#xff0c;因为采用的是原生的jdbcDriver链接数据库的&#xff0c;代码如下“ Class.forName(this.jdbcDriver); ”&#xff0c;我这边的配置是“ "jdbcDriver":"com.mysql.cj.jdbc.Driver" ”&am…

红帽限制 RHEL 代码访问,瞄准 Rocky Linux 和 AlmaLinux

CentOS Stream 是由 Red Hat 公司推出的一个开源操作系统&#xff0c;它与 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;密切相关。事实上&#xff0c;CentOS Stream 是 RHEL 开发过程中的一个中间流程&#xff08;在发布新的 RHEL 版本之前&#xff0c;Red Hat 会在…