C++:从C语言过渡到C++

news2024/9/22 11:37:48

在这篇博客中,我将会介绍从C语言过渡到C++的一些基础知识。

目录

C++起源

C++的关键字

输出hello,world

​编辑

命名空间

1.什么是命名空间

2.namespace的作用

3.域作用限定符

4.命名空间的使用

IO流

缺省参数

函数重载

引用

1.引用的定义

2.引用的特性

3.引用的使用

4.const引用

5.引用和指针

内联函数inline

nullptr


C++起源

1979年本贾尼·斯特劳斯特卢普在贝尔实验室中进行复杂的软件开发时,他感受到了C语言的局限性,于是他在此基础上设计了C++。

C++在C语言的基础上添加了面向对象编程的特性:封装、继承、多态。

随后几年,C++不断完善发展,在1998年推出了C++98,官方第一个较为完善的版本,引入了STL(标准模板库)。

2011年,C++的一次革命性的更新,增加了大量特性和功能

2020年,C++又一次巨大更新,引入了模板(Modules)、概念(Concepts)、协程(Coroutines)

在公司中,使用的比较多的都是C++98和C++11.

C++的关键字

输出hello,world

#include<iostream>
using namespace std;

int main()
{
	cout << "hello,world!" << endl;
	return 0;
}


命名空间

1.什么是命名空间

命名空间需要用一个关键字namespace后跟命名空间的名字,然后用{}括起来,在里面可以定义变量、函数、自定义类型,即为命名空间的成员


2.namespace的作用

在C/C++中,变量、函数、类是大量存在的,这些名称在全局域中可能会重复从而引发冲突

#include<stdlib.h>
int rand = 15;

int main()
{
	//这里会报编译错误,“rand” : 重定义;以前的定义是“函数”	
	printf("%d\n", rand);
	return 0;
}

C++中域有函数局部域,全局域,命名空间域,类域。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期命名空间域类域不影响变量生命周期。

namespace会定义一个域,也就是命名空间域,它与全局域独立,不同的域可以存在同名变量

我们可以将rand放于一个命名空间域,从而修正上述问题。

namespace只能定义在全局,当然他还可以嵌套定义

项目工程中多文件中定义同名namespace会认为是⼀个同namespace,不会冲突。


3.域作用限定符

既然有不同的有不同的域,那我们可以通过域作用限定符::)l来访问域中的成员变量。

::默认访问全局域;在其左侧加上域名就是访问该名字的域,如上面代码,Moss::rand就时访问的Moss域中的rand变量。


4.命名空间的使用

namespace的使用主要分为两种:

1.指定命名空间访问,实际项目中推荐这种。

2.使用关键字using命名空间的某个成员或者全部成员展开

C++标准库都放在⼀个叫std(standard)的命名空间中。

#include<iostream>
using namespace std;//展开std中的所有成员

IO流

IO流其实就是输入输出流,与之相关的头文件就是<iostream>。

<iostream>:Input Output Stream,标准输入输出流库,定义了标准输入输出对象。

std标准库就被包含在其中。

cout、cin、endl都属于C++标准库(std)

cout:用于屏幕输出

cin:用于键盘输入

endl:输出时,增加换行符('\n')

<<是流插入运算符,>>流提取运算符。(在C语言是左移/右移运算符)。

cout和cin的输出输入通过函数重载实现自动识别变量类型,无须像C语言那样指定格式。

使用格式如下:


缺省参数

缺省参数就是在声明或者定义函数时为函数的实参指定一个默认值无参数调用函数时,函数就会使用该默认值

需要注意的几个点:

1.当函数声明和定义分离时,缺省参数只能在函数声明出现,函数定义不能使用缺省参数。

2.缺省参数的指定在函数的声明或者定义中,规定缺省参数必须从右往左依次指定不能跳跃给缺省参数。

3.对于带缺省参数的函数调用从左往右依次传实参不能跳跃传

4.全缺省:全部形参给缺省值。

半缺省:部分形参给缺省值。


函数重载

函数重载同一作用域中出现同名函数,但是这些函数的形参各不相同

函数重载允许返回值的类型相等,但是返回值的类型不同 不能作为函数重载的标识

1.参数类型不同

2.参数个数不同

3参数类型顺序不同

接下来我们看一个需要警惕的坑

上面这两个函数构成函数重载,因为参数个数不同,但是这两个函数存在调用歧义,调用F()函数时,编译器不知道调用哪个函数。


引用

1.引用的定义

引用:给一个存在变量取别名引用变量原变量共用一块内存空间。

语法形式:类型& 引用的别名 = 引用对象

这里a、b、c、d都是共用一块内存空间的

2.引用的特性

1.引用的变量必须初始化

2.一个变量可以多个引用

3.引用一旦引用了一个变量,就不得再引用其他变量。(引用的指向不允许更改

int a = 5;

//编译错: ra必须初始化引用
//int& ra;

int& b = a;

int c = 10;
//这里是赋值,将c的值赋给b(a),不是改变引用的指向
b = c;

3.引用的使用

1.引用传参

2.做返回值

引用传参:

引用传参表面上是传值,但实际上传的是地址,只不过是编译器帮做了。

void Swap(int& x, int& y)//引用传参 可以替换 传址调用
{
	int tmp = x;
	x = y;
	y = tmp;
}

4.const引用

引用一个const对象时,必须const引用,否则就会权限放大,权限不允许放大,但可以缩小

const int a = 10;
//权限不能放大,必须用const引用
//int& ra = a;
const int& ra = a;

int b = 5;
//权限缩小是可以的
const int& rb = b;

临时对象:编译器在一块空间暂存表达式的结果时临时创建的未命名的对象

临时对象的引用:临时对象具有常性,也必须用const引用。(不用const引用就会触发权限放大,然后就报错)

int a = 4;
const int& ra = a * 3;//a * 3的结果存放在临时变量中,得用const引用

double d = 3.14;
const int& rd = d;//类型转换产生的中间值也存放在临时变量中,也得用const引用

5.引用和指针

1.引用必须初始化,不开空间指针存储变量地址,语法上可以不初始化(nullptr),但是要开空间

2.引用的指向不能改变,而指针可以随意更改

3.引用直接访问对象,指针要解引用。

4.sizeof的结果不同,引用结果为类型大小,但指针只跟多少位系统有关(32位4个字节,64位8个字节)

5.使用引用相对安全,指针容易出现空指针和野指针的问题。


内联函数inline

定义:用inline修饰的函数就是内联函数

作用:内联函数在调用的时候,编译器会在调用的地方展开内联函数,这样就不需要建立函数栈帧,以便提高效率。

所以我们通过作用就很容易想到,内联函数设计出来是为了代替C语言的宏函数,而替代的原因是宏函数的实现很容易出错。

//正确的宏实现
#define ADD(x, y) ((x) + (y))
// 为什么不能加分号?
// 为什么要加外面的括号?
// 为什么要加里面的括号?
//保证优先级
int main()
{
	cout << ADD(1, 2) * 5 << endl;

	int x = 1, y = 2;
	ADD(x & y, x | y);// ->(x&y + x|y)
	//+的优先级比& | 高,所以里面也要加括号

	return 0;
}

需要注意的点:

1.inline对于编译器只是建议,并不是说加了一定会在调用的地方被展开,一般来说,inline适用于简短而又被频繁调用的函数,对于代码较多的函数,加了inline也会被编译器忽略。

2.inline不推荐函数声明和定义分离到两个文件,如果inline函数被展开,链接时就会报错

 vs编译器在debug版本下默认不展开inline,以便调试。


nullptr

在C语言中,空指针NULL实际上是一个宏

NULL的使用不可避免存在一定的问题,本想调用指针版本的F(int* ptr),但是NULL被定义成0,从而调用了F(int x)版本,这有违初衷。

因此在C++中新增关键字nullptr,它可以转换任意类型的指针类型。

nullptr只能被隐式转换为指针类型,不能转换为整数类型,所以nullptr定义空指针可以避免类型转换。


拜拜,下期再见😏

摸鱼ing😴✨🎞

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

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

相关文章

Halcon 圆形检测(测量模型)

Halcon 圆形检测&#xff08;测量模型&#xff09; 资源 链接&#xff1a;https://pan.baidu.com/s/1icVPSCsnYLxfnyCkARLMog 提取码&#xff1a;47rj 原始图片 代码 * 1.读取图片 ******************************************** dev_update_off () read_image (Image, ./pa…

MySQL 9.0 正式发行Innovation创新版已支持向量

从 MySQL 8.1 开始&#xff0c;官方启用了新的版本模型&#xff1a;MySQL 创新版 (Innovation) 和长期支持版 (LTS)。 根据介绍&#xff0c;两者的质量都已达到可用于生产环境级别。区别在于&#xff1a; 如果希望尝试最新的功能和改进&#xff0c;并喜欢与最新技术保持同步&am…

成本下降50%,腾讯音乐StarRocks存算分离大规模实践!

作者:腾讯音乐高级数据工程师 陈嘉奇&#xff0c;腾讯音乐高级运营开发工程师 高盛远 小编导读&#xff1a; 腾讯音乐娱乐集团是中国在线音乐娱乐服务开拓者&#xff0c;提供如 QQ 音乐、酷狗音乐等众多知名的移动音频产品。 随着对成本效益的关注不断增强及湖仓一体化技术不断…

公益快报 | 中科亿海微以企业奖学金为纽带,深化校企合作

近日&#xff0c;为回报母校、激励湖南大学机器人视觉感知与控制技术国家工程研究中心广大学生&#xff0c;中科亿海微电子科技&#xff08;苏州&#xff09;有限公司&#xff08;简称“中科亿海微”&#xff09;捐赠设立企业奖学金。此项奖学金的设立标志着校企合作迈向全方位…

【Google 浏览器离线下载】

Google 浏览器离线下载: https://www.google.cn/chrome/index.html?standalone1#updates 点击“ 在此下载” , 即可下载 Google 浏览器离线版

vue+cesium之加载天地图影像底图与注记

目录 1.创建地图容器2.叠加天地图影像底图与矢量注记 关键代码3.示例效果图 Cesium是默认加载了微软公司的Bing地图&#xff0c;并提供了BingMapslmageryProvider类来加载Bing地图。也就是说&#xff0c;在创建Viewer时&#xff0c;如果不指定lmageryProvider类就默认加载Bing地…

C# .net6使用Hangfire

首先我们先来了解什么是Hangfire&#xff1f; Hangfire 是一个用于 .NET 的任务调度库&#xff0c;允许你在后台运行任务&#xff0c;而不需要依赖外部的任务队列服务或复杂的基础设施。它简化了后台任务的创建、调度和管理过程&#xff0c;使得在 .NET 应用程序中处理长期运行…

《mysql篇》--JDBC编程

JDBC是什么 JDBC就是Java DataBase Connectivity的缩写&#xff0c;翻译过来就很好理解了&#xff0c;就是java连接数据库。所以顾名思义&#xff0c;JDBC就是一种用于执行SQL语句的JavaApl&#xff0c;是Java中的数据库连接规范。为了可以方便的用Java连接各种数据库&#xff…

MURF1660CT-ASEMI智能AI应用MURF1660CT

编辑&#xff1a;ll MURF1660CT-ASEMI智能AI应用MURF1660CT 型号&#xff1a;MURF1660CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;16A 最大循环峰值反向…

【学术会议征稿】第五届智能设计国际会议(ICID 2024)

第五届智能设计国际会议&#xff08;ICID 2024&#xff09; 2024 5th International Conference on Intelligent Design (ICID 2024) 为贯彻落实国家创新驱动发展战略&#xff0c;积极服务秦创原创新驱动平台建设&#xff0c;助力区域经济高质量创新发展&#xff0c;西安设计联…

nVisual光纤资源管理APP价值分析

nVisual光纤资源管理APP利用数字孪生技术&#xff0c;可以快速创建光纤资源的数字孪生空间&#xff0c;解决“排查难”和“跟踪难”的问题。提供了预先在数字空间进行智能规划模拟变更、自动生成实施步骤和材料清单等功能&#xff0c;大幅度提高了规划的效率与准确性&#xff0…

uniapp实现光标闪烁(配合自己的键盘)

前言 因为公司业务需要&#xff0c;所以我们... 演示 其实就是Chat自动打字效果 代码 键盘请看这篇文件 <template> <view class"list"><view class"title"><text>手机号码</text></view><view class"ty…

怎么提高图片亮度?这四种方法轻松提高图片亮度!

怎么提高图片亮度&#xff1f;在数字图像处理的世界里&#xff0c;图片亮度不足的问题常常如暗夜的阴影般困扰着我们&#xff0c;这一问题不容忽视&#xff0c;因为它犹如一颗定时炸弹&#xff0c;随时可能引发一系列连锁反应&#xff0c;首先&#xff0c;亮度不足的图片如同被…

【轻松拿捏 】Java-static关键字(面试)

Java-static关键字 1. 定义和基本概念 回答要点&#xff1a; 示例回答&#xff1a; 2. static 变量 回答要点&#xff1a; 示例回答&#xff1a; 代码示例&#xff1a; 3. static方法 回答要点&#xff1a; 示例回答&#xff1a; 代码示例&#xff1a; 4. static 代…

Armv8-R内存模型详解

目录 1.内存模型的必要性 2.Armv8-R内存模型分类 2.1 Normal memory 2.2 Device Memory 2.2.1 Gathering 2.2.2 Reordering 2.2.3 Early Write Acknowledgement 3.小结 大家好&#xff0c;今天是悲伤的肌肉。 在调研区域控制器芯片时&#xff0c;发现了S32Z、Stellar …

威纶通触摸屏连接MySQL数据库步骤

目录 概要威纶通支持数据库的触摸屏类型测试Step 1 选择触摸屏型号Step 2 新增数据库服务器Step 3 添加SQL数据库查询功能Step 4 仿真测试 概要 通过使用威纶通带数据库类型的触摸屏&#xff0c;实现连接本地/远程MySQL数据库&#xff0c;并实现数据查询功能 威纶通支持数据库…

【开发环境】搭建PX4+ROS2+MAVROS2+Simulink+Optitrack实物联合仿真环境

搭建PX4ROS2MAVROS2SimulinkOptiTrack实物联合仿真环境 Ubuntu中的安装过程下载并编译PX4固件代码安装ROS2安装VRPN动捕数据转换ROS2话题库安装VRPN库拉取vrpn_client_ros2节点代码并配置VRPN server参数编译软件包启动vrpn_client_ros2节点重命名话题名 /vrpn/fly/pose 为 /ma…

Python爬虫新手实战导航:精选示例项目助你快速上手Python爬虫(含几十个案例源码)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Python爬虫 📒📝 爬虫小案例(附源码)📝 如何利用这些示例项目进行学习?🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 对于Python初学者而言,理论学习固然重要,但若想真正掌握爬虫技术,大量的实际项目训练和…

一篇喂饭级教程Python时序预测常用方法以及代码演示

在时序预测中,常用的方法包括以下几种&#xff1a; A.移动平均法 B.指数平滑法 C.自回归(AR)模型 D.滑动平均(MA)模型 E.自回归滑动平均(ARMA)模型 F.长短期记忆网络(LSTM) 下面我将逐一展示每种方法的代码示例&#xff1a; 1.移动平均法 import numpy as np# 创建时间…

华润万家超市购物卡怎么使用?

前两天整理杂物&#xff0c;翻出来两张华润的礼品卡&#xff0c;好在还没有过期 但是那卡只能在线下使用&#xff0c;而且面值也就一百 让我专门跑一趟华润感觉太不方便了 最后朋友告诉我说&#xff0c;可以在收卡云上面把卡内的余额直接提出来&#xff0c;我两张一百的卡总…