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

news2024/9/23 17:17:47

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

在这里插入图片描述

本文目录

  • Linux 学习记录41(C++篇)
  • 一、C++中的引用
    • 1. 引用的定义
    • 2. 引用的注意事项
    • 3. 引用的基本使用
    • 4. 引用作为函数的入口参数
    • 5. 引用作为函数的返回值
    • 6. 常引用
    • 7. 结构体引用
    • 8. 指针和引用的区别
  • 二、C++中的动态内存分配
    • 1. new关键字
      • (1. 申请单个类型的空间
      • (2. 申请单个类型的空间并赋值
      • (3. 申请单个类型的连续空间
      • (4. 申请单个类型的连续空间并初始化
    • 2. delete 关键字
      • (1. 释放单个空间
      • (2. 释放连续空间
    • 3. new/delete和C中malloc/free的区别
  • 三、C++中的函数
    • 1. 函数重载(overload)
    • 2. 函数的默认参数
    • 3. 哑元
    • 4. 内联函数(inline)
  • 四、C++中的结构体
  • 五、class 类
    • 1. 定义
    • 2. 封装
    • 3. 类和结构体的区别
  • 思维导图
  • 练习
    • 1. 定义一个矩形类(Rectangle) ,包含私有成员:长(length)、宽(width)

一、C++中的引用

在C语言中使用函数时,涉及到值传递与地址传递的问题

值传递:需要额外开辟空间,但是不能修改实参
地址传递:需要额外开辟空间,通过指针实现,能修改实参

1. 引用的定义

引用:是C++对C的一个重要的扩充
引用可以理解为给变量取别名不会额外开辟空间

  1. 左值

一般是变量,栈区、堆区、.bss、.data

  1. 右值

一般是常量或者是临时值(4+5),.ro

定义格式:变量类型 &引用目标=要引用的变量;

例·:

using namespace std;

int main(int argc, char const *argv[])
{
    int a = 99;
    int &buf = a;

    cout << a << endl;
    cout << buf << endl;
    cout << &a << endl;
    cout << &buf << endl;
    return 0;
}

输出:可以看到他们的值和地址都是一致的
在这里插入图片描述

2. 引用的注意事项

在C++中&有表示定义引用的作用,如果&前面是数据类型表示定义引用

1. 引用必须初始化
2. 指针可以指向NULL,但是引用不能指向NULL
3. 引用一旦指定就不能修改指向
4. 访问引用和访问变量取到的都是目标的值

3. 引用的基本使用

1. 一个目标可以有多个引用
2. 使用目标和使用引用是一样的值
3. 修改目标引用也会被修改,修改引用目标也会被修改
4. 引用和目标占用同一片空间

4. 引用作为函数的入口参数

例:

int add(int &a)
{
    a*=a;
    return a;
}

int main(int argc, char const *argv[])
{
    int a = 10;
    int &buf = a;

    add(a);

    cout << a << endl;
    return 0;
}

输出结果:
在这里插入图片描述

5. 引用作为函数的返回值

引用作为返回值需要返回生命周期长的变量的引用
声明周期长的变量:

1. 全局变量
2. malloc申请的堆区空间
3. static修饰的局部变量
4. 实参传递过来的变量
int &add(int a,int b)
{
    static int sum =a+b;
    return sum;//返回了一个静态变量sum的引用
}

int main()
{
    int a = 10;
    int b = 20;
    int buf = 25;

    add(a,b) = buf;//这里将函数内sum的值修改为了buf的值

    cout << a << endl;
    return 0;
}

6. 常引用

常引用:不能通过引用修改目标,为了保护目标不被修改
通常用保护变量不被引用修改,只能使用变量名来修改

int main()
{
    int a = 10;

    const int &ret = a;

//    ret = 90;//不能成立
    a = 90;

    cout << a << endl;
    return 0;
}

7. 结构体引用

如果结构体中包含引用,在使用结构体定义变量是就必须对引用进行初始化
例:

typedef struct
{
    int a;
    char b;
    int &ret;

}test_type;

int main()
{
    int num = 90;
    test_type buf = {1,2,num};//必须将结构体中的ret进行初始化

    cout << buf.ret << endl;
    return 0;
}

8. 指针和引用的区别

1. 引用必须初始化,指针不可以初始化
2. 指针可以指向NULL,引用必须有明确的目标
3. 指针能够改变指向,引用不能更改引用的目标
4. 指针需要额外开辟空间,引用不需要额外开辟空间,引用与目标使用同一片空间
5. 指针在使用前需要进行合理化检测,引用不需要。
6. 指针的大小由操作系统决定(64-8,32-4),而引用的大小和目标一致
7. 可以由多级指针,但是没有多级引用
8. 有指针数组,没有引用数组

二、C++中的动态内存分配

关键字:new,delete 用于C++中对于堆区空间申请和释放的关键字

1. new关键字

(1. 申请单个类型的空间

格式:指针 = new 数据类型
int main()
{
    int* p = new int;//使用new关键字在堆区申请了一个int大小的空间
    return 0;
}

(2. 申请单个类型的空间并赋值

格式:指针 = new 数据类型 (初始值)
int main()
{
    int* p = new int (2);//使用new关键字在堆区申请了一个int大小的空间,并赋值
	cout << *p << endl;
    return 0;
}

(3. 申请单个类型的连续空间

格式:指针 = new 数据类型[空间大小]
int main()
{
    int* arr = new int[5];//使用new关键字在堆区申请了一个int大小的空间,并赋值
    return 0;
}

(4. 申请单个类型的连续空间并初始化

格式:指针 = new 数据类型[空间大小] {初始化的数据}
int main()
{
    int* arr = new int[5] {0,1,2,3,4};//使用new关键字在堆区申请了一个int大小的空间,并赋值

    for (int i=0;i<5;i++)
    {
        cout << *(arr+i);
    }

    return 0;
}

2. delete 关键字

在C++中指针置空常用nullptr,而不是NULL

(1. 释放单个空间

格式:delete 要释放的指针名;
int main()
{
    int* p = new int;//使用new关键字在堆区申请了一个int大小的空间,并赋值
    delete p;
    p=nullptr;//给指针置空
    return 0;
}

(2. 释放连续空间

格式:delete []空间首地址;
int main()
{
    int* p = new int[5];//使用new关键字在堆区申请了一个int大小的空间,并赋值
    delete []p;
    p=nullptr;
    return 0;
}

3. new/delete和C中malloc/free的区别

1. new返回的结果不需要强制转换,但是malloc需要强制转换
2. malloc申请空间时需要自己计算空间大小,new直接使用数据类型申请
3. new/delete是C++中的关键字,malloc/free是函数
4. new/delete在释放空间时需要考虑空间是否连续的问题,malloc/free在释放时不需要
5. new申请的空间可以初始化,malloc不能
6. new在申请空间时自动调用构造函数
7. delete在释放空间时会自动调用析构函数

三、C++中的函数

1. 函数重载(overload)

函数重载是实现静态多态的一种方式,能够实现"一名多用"
解决同一功能函数,不同参数类型,不能同名的问题

重载条件
1. 入口参数不同(可以是个数不同,可以是类型不同,可以是参数名不同等等)
2. 函数名相同
3. 作用域相同
4. 和返回值无关

例:

int add(int a,int b)
{
    return a+b;
}

int add(int a,int b,int c)
{
    return a+b+c;
}


double add(double a,double b)
{
    return a+b;
}

string add(string a,string b)
{
    return a+b;
}

int main()
{
    cout << add(20,5) <<endl;
    cout << add(20,5,7) <<endl;
    cout << add(22.2,5.5) <<endl;
    cout << add("20","5") <<endl;
    return 0;
}

输出结果:
在这里插入图片描述

2. 函数的默认参数

函数重载和函数默认值尽量不要同时出现,可能会发送混乱

1. C语言中的函数参数都是由实参传递的,不能设置为默认参数
2. C++中可以使用,默认参数,给某些形参设置默认参数
3. 如果主调函数传递了实参,就使用实参,如果没有传递,就使用默认参数
4. 由于函数参数传递遵循靠左原则,设置默认参数必须从右到左开始设置(靠右原则)
5. 如果函数的某个参数设置了默认参数,则表示该参数右边的所有参数都有默认值
6. 主调函数写在了被调函数前,并且被调函数有默认参数,参数的默认值只能在函数声明的位置出现
double add(double a,double b=3.3);//函数声明

int add(int a,int b=5)//这里设置了默认参数
{
    return a+b;
}

int main()
{
    cout << add(22.2) <<endl;//第一个参数a使用了实参传值,b使用了默认参数
    cout << add(20) <<endl;//第一个参数a使用了实参传值,b使用了默认参数
    return 0;
}

double add(double a,double b)//这里设置了默认参数
{
    return a+b;
}

输出:
在这里插入图片描述

3. 哑元

功能:指在函数的形参列表中没有实际意义的参数(只有类型),调用时也需要传递参数,但函数不会获取

使用场景:
1. 在一个大型的程序中,如果对某个已经hi用很久的功能,做了修改,但是又不想修改过多的代码,还要保证之前的代码也能使用,就可以把某些形参定义为哑元
2. :自增自减运算符的重载

int add(int a,int b,int)//这里第三个int就是哑元
{
    return a+b;
}

4. 内联函数(inline)

函数是否被展开是编译器决定的,inline只是建议编译器
有些函数即使没有加inline也会被编译器展开

指在函数的调用前,将函数展开,在会在编译阶段将它展开
1. inline会建议编译器在(编译阶段)函数调用处展开函数
2. 一般要求内联函数的函数体足够小,一般在5行以内
3. 需要调用频繁
优点:效率高
缺点:会造成代码膨胀
定义格式:在函数定义前加上inline即可

例:

inline int add(int a,int b)//这里第三个int就是哑元
{
    return a+b;
}
int main()
{
    /*频繁调用*/
    cout << add(10,20) << endl;
    cout << add(10,20) << endl;
    cout << add(10,20) << endl;
    cout << add(10,20) << endl;
    cout << add(10,20) << endl;
    cout << add(10,20) << endl;
    cout << add(10,20) << endl;
    cout << add(10,20) << endl;
    return 0;
}

四、C++中的结构体

1. C++中的结构体允许定义函数
2. C++中的结构体允许对成员进行初始化
3. C++中的定义结构体允许奴家struct
4. C++中的的结构体有访问权限
5. C++中的结构体可以被继承,C中不可以
6. C++中可以在结构体内封装另一个结构体,而C语言中只能在结构体中使用另一个结构体

结构体外无法访问结构体内的private(私有权限)的数据,只有结构体内部才能访问。结构体内的成员默认是public(公有权限)

例:

struct per
{
    struct stu
    {//结构体内的结构体定义,不占用pre结构体空间
        int score;
    };
    int age=18;//对机构体内的变量进行初始化
    char sex;
};

struct P
{
private:   //私有的
    int fat=90;
    int high=180;
public:    //公共的
    void show();   //在结构体内实现函数的声明
};

//结构体外实现函数的定义
void P::show()
{//能够调用结构体内的私有权限的数据
    cout << "fat=\t" << fat << endl;
    cout << "high=\t" << high << endl;
}
int main()
{
    cout << sizeof(per) << endl;  //8,说明定义在per中的stu的声明,不占用内存空间
    cout << sizeof(per::stu) << endl;
    P p2;
    //cout << "p2.high" << p2.high << endl;   私有的结构体成员,在结构体外不能访问
    p2.show();

    return 0;
}

五、class 类

C++中的类由C++中的结构体演变而来
结构体: 变量和函数
类: 成员属性(成员变量)成员方法(成员函数)

1. 定义

格式:类内的权限默认是private(私有权限)
class 类名
{
	private:
	//私有的成员属性/方法
	public:
	//公有的成员属性/方法
	protected:
	//受保护的成员属性/方法
}

权限
private

类内可以访问,类外不能

public

类内可以访问,类外可以访问

protected

类内可以访问,类外不能

例:

class pre
{
private://私有的成员属性/方法
    string name;
    int age;
    int high;
public://公有的成员属性/方法
    void set(string str,int a,int h)
    {
        name=str;
        age=a;
        high=h;
    }
    void show(void)
    {
        cout << "name:" << name << endl;
        cout << "age:" << age << endl;
        cout << "high:" << high << endl;
    }
protected://受保护的成员属性/方法

};

int main()
{
    pre p;
    p.set("a",18,180);
    p.show();

    return 0;
}

输出结果:
在这里插入图片描述

2. 封装

封装

  1. 将某一事物的所有属性(变量),行为(函数)都封装为一个整体,并对私有成员的私有成员属性,提供公有的接口,用户可以进行修改
  2. 类中每个成员都有属性限制(private,public,protected)
  3. 类中的访问权限是对于整个类而言的
  4. 类内,同一个访问权限,可以出现多次
  5. 类内默认是私有权限

3. 类和结构体的区别

  1. 继承:类支持继承,结构体不支持继承
  2. 初始化:类的实例可以通过构造函数来初始化,而结构体不能有无参构造函数
  3. 内存分配:类在实例化时会在堆上分配内存,而结构体则在栈上分配内存
  4. 默认权限:类的属性和方法默认的访问修饰符是 private,而结构体的属性和方法默认的访问修饰符是 public。
  5. 用法:一般来说,类被用于描述一组相关的对象,而结构体被用于描述一组相关的值
  6. 传递方式:当作为参数传递时,类是按照引用传递,而结构体是按照值传递

思维导图

在这里插入图片描述

练习

1. 定义一个矩形类(Rectangle) ,包含私有成员:长(length)、宽(width)

定义成员函数:
设置长度: void set l(intl)
设置宽度: void set_w(int w)
获取长度: int get_I();
获取宽度:int get_w();
展示函数输出该矩形的周长和面积: void show()

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

using namespace std;

class Rectangle
{
private://私有的成员属性/方法
    int length;//长
    int width;//宽
public://公有的成员属性/方法
    void set_l(int num)
    {
        length = num;
    }
    void set_w(int num)
    {
        width = num;
    }
    int get_l(void)
    {
        return length;
    }
    int get_w(void)
    {
        return width;
    }
    void show(void)
    {
        cout << "周长:" << (length+width)*2 << endl;
        cout << "面积:" << length*width << endl;
    }
protected://受保护的成员属性/方法
};

int main()
{
    Rectangle rec;
    int buf = 0;
    cout << "请输入长:"<< endl;
    cin >> buf;
    rec.set_l(buf);
    cout << "请输入宽:"<< endl;
    cin >> buf;
    rec.set_w(buf);
    cout << "获取到的长:"<< rec.get_l() << endl;
    cout << "获取到的宽:"<< rec.get_w() << endl;
    rec.show();
    return 0;
}

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

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

相关文章

AI建模工具对比:如何选择适合你的工具套件

在人工智能&#xff08;AI&#xff09;的浪潮下&#xff0c;越来越多的企业和科研机构开始应用AI技术进行建模和分析。然而&#xff0c;选择哪种AI建模工具套件一直是一个让人挠头的问题。市面上存在着众多的AI建模工具&#xff0c;它们各有特点和优势&#xff0c;但如何找到适…

SpringBoot启动失败,也不报错

1&#xff09;将启动类添加try-catch捕获信息 在springboot的启动类中添加try-catch即可出现具体错误信息&#xff1b; try {SpringApplication.run(ConverterApplication.class, args);} catch (Exception e) {System.out.println("e.getMessage() " e.getMessage…

海运费查询:了解国际海运费的方法与注意事项

国际贸易中&#xff0c;海运是一种常见的货物运输方式。而对于企业或个人来说&#xff0c;了解和查询国际海运费是非常重要的。本文将介绍一些查询国际海运费的方法和注意事项&#xff0c;帮助您更好地掌握海运费用信息。 一、国际海运费的计算方法 FCL&#xff08;整箱&#…

祖冲之算法

祖冲之算法 1.题目描述 π 3.1415926~3.1415927之间 4/1-4/34/5-4/74/9-4/114/13.......... 通过关系,来计算 运算多少次之后,才会得到3.1415926~3.1415927之间2.代码 public class Main2 {public static void main(String[] args) {double ltargetPi3.1415926;double rtarg…

两两交换链表中的节点(LeetCode 24)

题目 24. 两两交换链表中的节点 思路 最开始自己画&#xff0c;越画越复杂比较复杂&#xff0c;写不出来&#xff01;&#xff08;呜呜&#xff09;去看了解题思路&#xff0c;发现只需要三步。&#xff0c;按以下思路写了代码&#xff0c;循环停止那里的条件我还以有更好的写…

android逆向开发之Frida逆向基础

Frida是一款功能强大的动态分析和逆向工程工具&#xff0c;可用于在运行时修改和监控应用程序。它支持多个平台&#xff0c;包括Android、iOS、Windows、macOS等&#xff0c;提供了JavaScript API&#xff0c;使用户能够在目标应用程序中直接执行自定义的脚本代码。 基础知识 …

CSS_高度自动过渡 auto height

方法一 grid 布局中的 fr 单位&#xff08;推荐使用&#xff09; <div class"wrap"><button class"trigger">鼠标放上来试试</button><div class"grid"><div><p>高度自动过渡</p></div></d…

leedcode-只出现一次的数字-异或

题目 题目 代码 class Solution { public:int singleNumber(vector<int>& nums) {int ansnums[0];for(int i1;i<nums.size();i){ansans^nums[i];}return ans;} };

【力扣】144、二叉树的前序遍历

力扣、144 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 // 递归遍历 var preorderTraversal function(root){let arr [];var fun &#xff08;node&#xff09;>{if(node){//先根节点&#xff1a;arr.push(node.val);fun(node.left);//遍历左子树…

IT必备的技能,看看你掌握了吗?

目录 架构知识技术与业务场景的结合数据库知识操作系统知识网络知识存储知识云计算知识编程语言知识软件产品知识硬件知识信息安全知识IT前沿技术知识。 今天在看一本书叫做《一本书讲透售前》&#xff0c;这本书分为了两部分&#xff1a; 第一部分描述了售前的工作篇&#xff…

Python图像高光调整

看了这个文章&#xff0c;里面有专门的c的实现&#xff0c;我这边简单的使用python进行了实现&#xff0c;实现了两个版本&#xff0c;一个是python遍历像素&#xff0c;一个是使用numpy加速&#xff0c;代码如下&#xff1a; import time import numpy as np import cv2def l…

软考高级系统架构设计师(六) 企业应用集成电子商务

目录 企业应用集成(重点) 电子商务 企业应用集成(重点) ps: 数据集成&#xff0c;比如 数据中间件 业务流程集成&#xff1a;过程集成&#xff0c;B2B--企业之间 企业门户&#xff1a; ps: 重构需求 电子商务

在教育领域中使用ChatGPT有哪些优点?

人工智能在教育领域的应用正在迅速增加。OpenAI于2022年11月开发的聊天机器人ChatGPT在全球范围内广受欢迎。 由于其受欢迎程度以及生成类似人类问题的回答的能力&#xff0c;ChatGPT正在成为许多学习者和教育工作者值得信赖的伴侣。然而&#xff0c;与任何新兴技术一样&#x…

机器学习——Word2Vec

参考资料&#xff1a; https://zhuanlan.zhihu.com/p/114538417https://www.cnblogs.com/pinard/p/7243513.html 1 背景知识 1.1 统计语言模型 统计语言模型是基于语料库构建的概率模型&#xff0c;用来计算一个词串 W ( w 1 , w 2 , ⋯ , w T ) W(w_1,w_2,\cdots,w_T) W…

计网实验第二章:TCP与UDP实验

TCP 1.服务器绑定端口号启动服务器欢迎socket。 2. 等待客户端发送请求。 3.等到客户端发送请求之后&#xff0c;服务器与客户端重新建立一个socket&#xff0c;但是客户端的目标端口不变。 java代码如下 客户端 客户端代码图解 import java.io.*; import java.net.*; clas…

《JavaScript 权威指南》犀牛书阅读详解

前言&#xff1a; 《JavaScript 权威指南》&#xff08;JavaScript&#xff1a;The Definitive Guide&#xff09;是一本由David Flanagan所著的JavaScript领域的经典书籍&#xff0c;它是学习和开发JavaScript应用不可或缺的参考书之一。该书分为两个部分&#xff0c;第一部分…

C语言程序在内存中是怎样布局的

理论 我们假设在32位Linux下进行编程&#xff0c;首先要明确&#xff0c;我们的虚拟地址空间有4G&#xff0c;4G的地址空间的寻址范围就是 0x0000_0000 ~ 0xFFFF_FFFF&#xff0c;在Linux下&#xff0c;高地址的1G内存是给操作系统使用的&#xff0c;也就是 0xC000_0000 ~ 0xF…

复习javascript第1章

JavaScript 是全球最流行的编程语言。 JavaScript 是属于 Web 的编程语言。 JavaScript 很容易学习。 JavaScript 能够改变 HTML 内容 getElementById() 是多个 JavaScript HTML 方法之一。 本例使用该方法来“查找” id"demo" 的 HTML 元素&#xff0c;并把元素…

深入浅出设计模式 - 迭代器模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

Firefox开启TLS 1.1支持 问题&#xff1a; 建立安全连接失败 连接到…时发生错误。对等端使用了不支持的安全协议版本。 错误代码&#xff1a;SSL_ERROR_UNSUPPORTED_VERSION 由于不能验证所收到的数据是否可信&#xff0c;无法显示您想要查看的页面。 建议向此网站的管理…