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的区别?
-
new/delete是c++的操作符,而malloc/free是库函数
-
new 在调用时会先为对象分配内存,再调用对象的构造函数,而malloc不会;
delete 在调用时会调用析构函数,而free不会
-
使用malloc为对象指针分配内存,要明确指定分配内存大小,而new不需要
-
new作为操作符,可以被重载,而malloc不行
-
new分配内存成功,则返回对象指针;而malloc分配成功会返回void*类型指针
-
new如果分配内存失败会抛出bad_alloc异常;而malloc分配内存会返回NULL指针
-
new从自由存储区为对象分配内存;malloc从堆上分配内存(自由存储区可以在堆也可以在其他地方(比如静态存储区),这取决于编译器从哪里为new的使用分配内存。)
相关文章:

c++(一)
c(一) C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别? C与C有什么区别 <1>都是…...
java面试中高频问题----1
一、乐观锁和悲观锁定义、场景怎么判断用什么? 1.乐观锁: 定义:乐观锁假设大多数情况下,资源不会发生冲突。因此,允许多个线程同时访问资源。 场景:读操作多,写操作少,数据冲突概率…...

ABB 控制柜
1,主计算机:相当于电脑的主机,用于存放系统和数据,需要24V直流电才能工作。执行用户编写的程序,控制机器人进行响应的动作。主计算机有很多接口,比如与编程PC连接的服务网口、用于连接示教器的网口、连接轴…...

【错误记录】HarmonyOS 运行报错 ( Failure INSTALL_PARSE_FAILED_USESDK_ERROR )
文章目录 一、报错信息二、问题分析三、解决方案 一、报错信息 在 DevEco Studio 中 , 使用 远程设备 , 向 P40 Failure[INSTALL_PARSE_FAILED_USESDK_ERROR] compileSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the device. 二、…...

使用C语言openssl库实现 RSA加密 和 消息验证
Q:什么是RSA? A:RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,是最早的一种用于公开密钥加密和数字签名的算法。它使用一对公钥(public key)和私钥(private key&…...
海外投放面试手册
海外投放面试手册 岗位职责: 负责Google 、Facebook、TikTok、Twitter等海外主流广告平台的自主投放操作及合作渠道沟通;负责海外合作渠道媒体的广告投放管理、媒体数据监测、效果分析、优化调整等工作; 3.了解海外各渠道&…...

第十三章 进程与线程
第十三章 进程与线程 程序与进程的概念 程序: 英文单词为Program,是指一系列有序指令的集合,使用编程语言所编写,用于实现一定的功能。 进程: 进程则是指启动后的程序,系统会为进程分配内存空间。 函数式…...
Flink面试整理-对Flink的高级特性如CEP(复杂事件处理)、状态后端选择和调优等有所了解
Apache Flink 提供了一系列高级特性,使其成为一个强大的实时数据处理框架,特别适用于复杂的数据处理场景。其中,复杂事件处理(CEP)、状态后端的选择和调优是其中重要的几个方面。 复杂事件处理(CEP) CEP 概念:CEP 是用于在数据流中识别复杂模式的技术。它允许用户指定事…...

算法:树状数组
文章目录 面试题 10.10. 数字流的秩327. 区间和的个数315. 计算右侧小于当前元素的个数 树状数组可以理解一种数的存储格式。 面试题 10.10. 数字流的秩 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构…...

Kafka SASL_SSL集群认证
背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka SASL_SSL安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详…...

同城交友论坛静态页面app Hbuild
关注...
spring session+redis存储session,实现用户登录功能,并在拦截器里面判断用户session是否过期,过期就跳转到登录页面
在Spring应用中,使用Redis存储Session是一种常见的方式,可以实现分布式环境下的Session管理。以下是实现用户登录功能,并在拦截器中判断Session是否过期并跳转到登录页面的基本步骤: 添加依赖:首先,确保你的…...
Debug-013-el-loading中显示倒计时时间
前言: 今天实现一个小小的优化,业务上是后端需要从设备上拿数据,所以前端需要不断调用一个查询接口,直到后端数据获取完毕,前后端根据一个ending字段为true判断停止调用查询接口。由于这个查询时间比较久&…...
5月29日,每日信息差
第一、据悉,微信视频号直播电商团队将并入到微信开放平台(小程序、公众号等)团队,原微信视频号直播电商团队转由微信开放平台负责人负责。知情人士表示,此次调整,将有助于微信视频号直播电商业务更好地融入…...

2024年弘连网络FIC大会竞赛题线下决赛题
总结: FIC决赛的时候,很多小问题没发现,在pve平台做题确实很方便。 这套题目复盘完,服务器这块的知识确实收获了很多,对pve集群平台和网络拓扑也有了一定的认识,感谢各位大佬悉心指导。 接下来࿰…...

Element-UI 入门指南:从安装到自定义主题的详细教程
Element-UI 是一个基于 Vue.js 的前端组件库,它提供了丰富的 UI 组件,可以帮助开发者快速构建高质量的用户界面。以下是使用 Element-UI 的快速入门指南: 安装 Element-UI Element-UI 是一个基于 Vue.js 的组件库,它提供了丰富的…...

vs工程添加自定义宏
一、简介 用户可以添加自定义宏变量方便工程路径名称的修改和配置 例:$(SolutionDir) 为解决方案路径,$(PojectDir) 为工程所在路径 测试环境:vs2017,qt5.14.0 二、配置 1、打开属性窗口:视图-》其他窗口-》属性管…...
shell脚本:将一维数组以二维数组显示
shell脚本:将一维数组改成二维数组显示 1.编辑脚本文件 vi output_array.sh2.编写脚本 #!/bin/bash# 假设一维数组one_array已经包含9个元素 one_array(1 2 3 4 5 6 7 8 9) # 获取数组长度 length${#one_array[]} # 数组长度除以3获得新数组行数n n$((length / …...

QT C++ 读写mySQL数据库 图片 例子
在上篇文章中描述了怎样搭建读写数据库的环境。 本文更进一步,描述了读写mySQL数据库,字符、整型数字、图片。读写图片相对难点。 数据库的图片字段用BLOB,如果图片较大要用longblob,否则会报错。 另外,读写数据库都使用了短连…...
Unix环境高级编程--8-进程控制---8.1-8.2进程标识-8.3fork函数-8.4 vfork函数
1、进程控制几个过程 创建进程--》执行进程---》终止进程 2、进程标识 (1)专用进程:ID为0的进程是调度进程,常常被称为交换进程,也称为系统进程; ID为1通常是init进程,在自举结束时由内核调用…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...