c++(一)

c++(一)

  • C与C++有什么区别
  • 命名空间
    • 使用
  • 输入输出流
  • 引用
    • 指针和引用的区别
    • 定义
    • 拓展
  • 函数重载
    • 例子
    • 测试
    • 函数重载原理
  • 参数默认值
    • 什么是参数默认值
    • 注意
  • 在c++中如何引入c的库
  • 动态内存分配
    • new、delete与malloc、free的区别?

在这里插入图片描述

C与C++有什么区别

<1>都是编程语言
<2>C是面向过程的,C++是面向对象的
<3>第一个字母都是相同,在C语言中只要是合法的C语言语句,在C++中都是可以使用的(C++完全兼容C)
<4>++:在C的基础上增加了一些新的内容(新特性、关键字、数据类型等等)
<5>C是面向过程的编程语言;C++是面向对象的编程语言!C是注重过程的!C++注重的是结
果!!!C也有在面向对象编程,是通过结构体,但是因为C里面的结构体中只能描述属性,不能有函数,所以面向对象编程不够彻底,引入C++来解决这个问题!

命名空间

理解成是一个容器,可以放数据类型、函数、变量!
为了解决:在C语言中,能出现同名的函数吗?能出现同样的自定义的数据类型吗? 在同一个作用域内能出现同名的变量吗? 都不可以的!
作用:解决命名冲突,命名冲突的情况: 函数、数据类型、变量!

格式: namespace 命名空间的名字
{
函数;
数据类型;
变量
}


namespace s1
{int count = 10;struct STU_T{int sno;char name[20];};void print(){printf("s1中的count=%d\n", count);}
}
namespace s2
{int count = 10;struct STU_T{int sno;char name[20];};void print(){printf("s2中的count=%d\n", count);}
}

使用

方法1 命名空间::函数();

int main()
{//使用方法1s1::print();s2::print();printf("hello world\n");return 0;
}

方法2 将命名空间搞成全局变量,访问时只需要变量前面加上::(域运算符)

using namespace s1; //切换到这个命名空间中===》把命名空间中的内容做成全局
int main()
{//使用方法2::print();printf("%d\n", count);//使用方法1s2::print();printf("hello world\n");return 0;
}

在这里插入图片描述

输入输出流

流: 以字节为单位, 连续不断,方向统一的。
C中标准输入输出函数: printf()、scanf()、 putchar()、getchar()、 gets()、puts()。这些函数在C++中仍然是可以使用的!除此之外,C++中引入了新的可以做输入输出的方法:

//之前需要引用
#include  <iostream>
using namespace std;
输入:cin >> 变量;
输出:cout << 变量;

在这里插入图片描述

引用

是一种数据类型,用来给变量起别名

弱化指针(在C中可以用指针来实现的,在C++中都可以使用引用来替换)
减少临时空间的分配

指针和引用的区别

1. 指针可以定义后不初始化,但引用定义后必须初始化;
2. 指针定义时,需要开辟内存空间;引用和变量公用同一块内存空间,不会重新分配内存空间;
3. 指针是存储某个实例的地址;引用是实例的别名
4. 指针变量的值可以为空;引用没有空引用;
5. 理论上指针级数没有限制,但引用只有一级,不存在引用的引用,但可以有指针的指针
6. 不可以对函数的局部变量或对象以引用或者指针的方式返回
7. ++引用与++指针效果不同,对指针变量的操作会使指针指向下一个实体的地址,而不是改变所指实体的内容
8. 对指针变量使用“sizeof”得到的是指针变量的大小,对引用使用“sizeof”得到的是变量的大小
9. 指针变量作为形参时需要测试合法性进行判空,引用不需要判空
10. 指针使用时要加 “ * ”,引用可以直接使用
11. 指针是可以改变指向的; 引用是不可以改变指向的 引用比指针安全

定义

数据类型 &别名 = 变量名;
//注意:引用必须初始化,一旦初始化之后再不能给引用赋值

在这里插入图片描述

拓展

int a = 10;
const int &a_pt = a;
a_pt = 20;//error(不能对引用再次赋值)
const int &m = 200;// 等价于 #define m 200

函数重载

解决命名困难的问题
概念:函数功能相似,函数名相同,参数不同,与返回值类型无关的一组函数,互为重载
参数不同: 参数个数不同、参数类型不同、参数类型的顺序不同

例子

#include <iostream>
using namespace std;int sum(int a, int b)
{cout << "int,int" << endl;return a + b;
}
int sum(int a, double b)
{cout << "int, double" << endl;return a + b;
}
int sum(double a, int b)
{cout << "double, double" << endl;return a + b;
}
int sum(int a)
{cout << "int" << endl;return a + 0;
}
double sum(double a, double b)
{cout << "double, double" << endl;return a + b;
}
char sum(char a, char b)
{cout << "char, char" << endl;return a + b;
}
string sum(string a, string b)
{cout << "string,string" << endl;return a + b;
}int main()
{//调用的函数名是相同的,只是传入了不同的参数,他根据传入的参数的类型匹配了对应的函数去执行了cout << sum(5) << endl;cout << sum(5,6) << endl;cout << sum(5.3, 6) << endl;cout << sum(5, 6.8) << endl;cout << sum(5.3, 6.8) << endl;cout << sum('A', '\0') << endl;cout << sum("123", "abc") << endl;//如上执行了不同的代码块,根据函数调用的原理,说明每一个调用函数的地方,函数地址都是不同的,也就说明// 函数名应该是不一样的! 函数名不一样,那是因为用的编译器不同了! gcc / g++return 0;
}

在这里插入图片描述

1.函数调用原理:在调用函数的地址其实保存的是函数的地址,执行的时候会根据函数地址到对应的内存空间,然后执行对应的代码块;
2.当代码块执行完之后再返回到调用函数的地址,继续向下执行!

测试

同一个.c文件,分别使用gcc和g++进行编译,使用nm 可执行文件名
在这里插入图片描述
gcc编译后的结果,函数名没有变
在这里插入图片描述
g++编译后的结果, 函数名发生变化了: 根据函数名的长度、函数名、参数的个数以及参数的类型进行重命名,名字发生了变化,对应函数的地址也就不同,执行的时候就根据不同的地址执行不同代码块!

函数重载原理

使用g++编译后,函数名根据函数名的长度、参数个数、数据类型进行了重命名,函数名变了地址也就
变了,调用时执行的就是不同的函数体

参数默认值

简化代码:
函数重载:当只有参数个数不同的情况下造成的代码冗余

什么是参数默认值

在定义/声明的时候给形参进行初始化
int sum(int a = 0,int b = 0,int c = 0)

注意

  • 写默认参数的时候是从右至左,因为调用的时候实参给的顺序是从左至右
    在这里插入图片描述
  • 没有给默认参数传参时,就按默认值处理
  • 给默认参数传参时,就按传入的实参进行处理

在这里插入图片描述

  • 二义性:函数重载有默认参数时
  • 解决:保留参数个数最多的,且有默认值的函数
    在这里插入图片描述
  • 当声明和定义同时存在时,参数默认值只能放在函数声明中
    在这里插入图片描述

在c++中如何引入c的库

以静态库为例
使用gcc编译
在这里插入图片描述
在这里插入图片描述
使用g++编译
在这里插入图片描述
问题:使用g++编译时函数的名称发生了改变
解决:使用g++编译器编译时函数的名称不能发生改变
在这里插入图片描述
问题:如何判断是gcc还是g++编译器
方法1:通过宏来判断

__cplusplus

在这里插入图片描述

在这里插入图片描述
方式2:通过单个字符来测试

在c里面单个字符当做整型来用,长度是四个字节
在c++里面单个字符占一个字节

在这里插入图片描述

动态内存分配

在C语言中,使用malloc做动态内存分配, 使用free去做释放!

int main()
{int* p = nullptr;p = (int *)malloc(4 * 4);if (p==nullptr){printf("malloc error\n");return -1;}else{memset(p, 0, sizeof(int)*4);*p = 100;*(p+1) = 200;*(p + 2) = 300;*(p + 3) = 400;free(p);}return 0;
}

在C++中引入新的方式来动态内存分配 new运算符开空间 delete 运算符释放空间

语法:
一块空间分配与释放:
数据类型 *变量 = new 数据类型; //不初始化
delete 变量;
数据类型 *变量 = new 数据类型();//有初始化
delete 变量;
连续空间分配与释放:
数据类型 *变量 = new 数据类型[几块]; //不初始化
delete [] 变量;
数据类型 *变量 = new 数据类型[元素个数]();//括号
int main()
{int* p = nullptr;//去堆区分配了4字节的内存空间p = new int;cout << *p << endl; // 随机数----没有初始化int* pp = nullptr;//去堆区分配了4字节的内存空间pp = new int(6);cout << *pp << endl; // 自动进行了初始化,不			传值,默认值为0;传了值进来,就按传进来的值进行初始化char* ptr = new char[10]; //连续分配了10char类型的空间cout << ptr << endl;delete p; //释放一块空间delete [] ptr; //释放连续空间return 0;
}

在这里插入图片描述

new、delete与malloc、free的区别?

  1. new/delete是c++的操作符,而malloc/free是库函数

  2. new 在调用时会先为对象分配内存,再调用对象的构造函数,而malloc不会;

    delete 在调用时会调用析构函数,而free不会

  3. 使用malloc为对象指针分配内存,要明确指定分配内存大小,而new不需要

  4. new作为操作符,可以被重载,而malloc不行

  5. new分配内存成功,则返回对象指针;而malloc分配成功会返回void*类型指针

  6. new如果分配内存失败会抛出bad_alloc异常;而malloc分配内存会返回NULL指针

  7. new从自由存储区为对象分配内存;malloc从堆上分配内存(自由存储区可以在堆也可以在其他地方(比如静态存储区),这取决于编译器从哪里为new的使用分配内存。)

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

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

相关文章

Introduction of Internet 计算机网络概述

计算机网络的概念 计算机网络的定义&#xff1a; 多台独立的计算机通过通信线路实现资源共享的计算机系统 计算机网络的组成 资源子网&#xff1a;提供共享的软件资源和硬件资源 通信子网&#xff1a;提供信息交换的网络结点和通信线路 计算机网络类型 按照拓扑排序 星型…

【STM32】计算定时器的溢出

TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大计数频率84M。 TIM1、8、9、10、11在APB2上&#xff0c;最大计数频率168M。 time(arr1)/(prescale1)/Tclk 算出来的是秒 下图使用TIM14 84MHz 那么time33600*25000/8400000010S&#xff0c;10S进入一次中断 中断方式开…

基于STM32+NBIOT(BC26)设计的物联网观赏鱼缸

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目模块组成 1.2 设计思路 二、(硬件控制端)硬件选型2.1 STM32开发板2.2 PCB板2.3 USB下载线2.4 NBIOT模块2.5 杜邦线&#xff08;2排&#xff09;2.6 稳压模块2.7 电源插头2.8 水温检测传感器2.9 水质检测…

TiDB学习4:Placement Driver

目录 1. PD架构 2. 路由功能 2. TSO 2.1 TSO 概念 2.2 TSO分配过程 2.3 TSO时间窗口 3. 调度 3.1 信息收集 3.2 生成调度(operator) 3.3 执行调度 4. Label 与高可用 4.1 Label 的配置 5. 小结 1. PD架构 PD是整个TiDB的总控&#xff0c;相当于集群的大脑 PD集成了…

Android 版本与 API level 以及 NDK 版本对应

采用 Android studio 开发 Android app 的时候&#xff0c;需要选择支持的最低 API Level 和使用的 NDK 版本&#xff0c;对应开发 app 的最低 SDK 版本&#xff1a; 在 app 的 build.gradle 文件里&#xff0c;对应于代码如下&#xff1a; 目前各版本的占有率情况如下&#xf…

PaddleSeg训练推理及模型转换全流程

文章目录 1、数据准备1.1 数据标注1.2 数据导出1.3 标签较验1.4 数据集整理1.5 标签可视化 2、 模型训练3、模型验证4、模型推理5、模型导出6、导出文件的推理7、将模型转换成onnx8、使用onnx进行推理 本文记录一下使用paddleseg进行语议分割模型对人体进行分割的使用流程。事实…

jmeter服务器性能监控分析工具ServerAgent教程

ServerAgent介绍&#xff1a;支持监控CPU&#xff0c;memory&#xff0c;磁盘&#xff0c;网络等&#xff0c;和JMeter集成&#xff0c;在JMeter的图形界面中&#xff0c;可以实时看到监控的数据&#xff0c;但是&#xff0c;它只能监控硬件资源使用情况。 不能监控应用服务 S…

MySQL:表的约束

文章目录 0.小知识&#xff0c;数据转化1.空属性(非空约束)2.默认值&#xff08;default&#xff09;3.comment&#xff08;列描述&#xff09;4.zerofill(显示约束)5.primary key(主键约束)6.auto_increment(自增长)7.unique(唯一键)8.foreign key (外键)9.综合表结构的设计 表…

安装qianfan大模型库,报错:ERROR: Command errored out with exit status 1

安装qianfan大模型库&#xff08;pip install qianfan&#xff09;&#xff0c;报错&#xff1a;ERROR: Command errored out with exit status 1 分析错误&#xff0c;是加载 pycryptodome库时导致的 解决&#xff1a; 1、命令行中重新安装&#xff1a;>pip install pycry…

lspci 显示当前设备的PCI总线信息

lspci 显示当前设备的PCI总线信息 lspci 显示当前设备的PCI总线信息显示当前主机的所有PCI总线信息&#xff1a;以数字方式显示PCI厂商和设备代码同时显示数字方式还有设备代码信息以树状结构显示PCI设备的层次关系&#xff1a;更多信息 lspci 显示当前设备的PCI总线信息 lspc…

XXE(XML外部实体注入)

1、XXE原理 XXE&#xff08;XML外部实体注入&#xff0c;XML External Entity) &#xff0c;在应用程序解析XML输入时&#xff0c;当允许引用外部实体时&#xff0c;可构造恶意内容&#xff0c;导致读取任意文件、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命…

01-Linux【准备篇】

一、学Linux的作用&#xff1f; 1.Linux下开发(部署)软件项目 2.Linux运维 二、Linux的强与弱 1.薄弱 个人桌面领域的应用 此领域是传统Linux应用薄弱的环节&#xff0c;近些年随着Ubuntu、fedora等优秀桌面环境的兴起&#xff0c;Linux在个人桌面领域的占有率在慢慢提高…

潮玩宇宙Dapp游戏:密室大逃杀的魅力探索

在潮玩宇宙这片充满创意与激情的虚拟世界中&#xff0c;一款名为“密室大逃杀”的Dapp游戏凭借其独特的玩法和紧张刺激的氛围&#xff0c;迅速成为了玩家们热衷的焦点。这款游戏不仅融合了传统的密室逃脱元素&#xff0c;还巧妙地结合了区块链技术&#xff0c;为玩家带来了全新…

docker不删除容器更改其挂载目录

场景&#xff1a;docker搭建的jenkins通常需要配置很多开发环境&#xff0c;当要更换挂载目录&#xff0c;每次都需要删除容器重新运行&#xff0c;不在挂载目录的环境通常不会保留。 先给一个参考博客docker不删除容器&#xff0c;修改容器挂载或其他_jenkins 修改容器挂载do…

linux中最常用的文件管理命令

linux中最常用的文件管理命令 linux中最常用的文件管理命令最常用的且没有之一的 ls命令格式不加任何参数使用-l显示更多细节使用-t按照时间排序使用-r按照时间逆序使用-S根据文件大小排序 查看庐山真面貌的cat实例 &#xff1a;简单显示内容实例 &#xff1a;显示行号 -n实例 …

React 其他 Hooks

其他 Hooks useRef 可用于获取 DOM 元素 const ScrollRef useRef(null)ScrollRef.current useContext &#xff08;先回顾一下之前的 Context 知识&#xff0c;借用之前 ppt 和源码&#xff09; Hooks 中使用 useContext 来获取 context 的值 // 父组件创建 contextexpor…

20232801 2023-2024-2 《网络攻防实践》实践十一报告

#20232801 2023-2024-2 《网络攻防实践》实践十一报告 1.实践内容 &#xff08;1&#xff09;web浏览器渗透攻击 使用攻击机和Windows靶机进行浏览器渗透攻击实验&#xff0c;体验网页木马构造及实施浏览器攻击的实际过程。 &#xff08;2&#xff09;取证分析实践—网页木马…

抖音运营_抖音推荐算法的机制

目录 一 抖音流量推荐算法机制 二 4大关键指标 三 完播率 1 黄金3秒 2 内容严谨 3 期待感 4 用户痛点 5 通俗易懂 四 转发量 1 分享需求 2 分享快乐 3 共情表达 4 正义传播 五 评论量 1 话题性 2 争议性 3 参与感 4 评论回评 六 点赞量 1 情感共鸣 2 用户喜…

【Flutter】AppBar、TabBar和TabBarView

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月26日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

FTP协议——BFTPD基本操作(Ubuntu+Win)

1、描述 本机&#xff08;Win10&#xff09;与虚拟机&#xff08;Ubuntu22.04.4&#xff09;上的BFTPD服务器建立FTP连接&#xff0c;执行一些基本操作。BFTPD安装教程&#xff1a;FTP协议——BFTPD安装&#xff08;Linux&#xff09;-CSDN博客 2、 步骤 启动BFTPD。启动文件…