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

在这篇博客中,我将会介绍从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.mzph.cn/bicheng/45497.shtml

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

相关文章

【Python3】自动化测试_Playwright最简单示例

启动 Playwright实例&#xff1a;sync_playwright().start() 终止 Playwright 实例&#xff1a;myPlaywright.stop() Playwright 模块提供了一种启动浏览器实例的方法。以下是使用 Playwright 驱动自动化的典型示例&#xff1a; from playwright.sync_api import sync_playw…

C++入门基础简述

文章目录 前言1、C首个程序2、namespace关键字3、C输入/输出4、缺省参数5、函数重载6、C中的引用7、const 引用8、指针和引用的关系9、inline关键字10、nullptr关键字 前言 此篇文章主要简述流程&#xff1a;C首个程序 -> namespace关键字 -> C输入/输出 -> 缺省参数 …

【C++航海王:追寻罗杰的编程之路】一篇文章带你认识哈希

目录 1 -> unordered系列关联式容器 1.1 -> unordered_map 1.1.1 -> unordered_map的文档介绍 1.1.2 -> unordered_map的接口说明 1.2 -> unordered_set 2 -> 底层结构 2.1 -> 哈希概念 2.2 -> 哈希冲突 2.3 -> 哈希函数 2.4 -> 哈希冲…

100 个网络基础知识普及,看完成半个网络高手!

1&#xff09;什么是链接&#xff1f; 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2&#xff09;OSI 参考模型的层次是什么&#xff1f; 有 7 个 OSI 层&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0…

公有云API常见的认证方式

公有云API常见的认证方式 Token认证 &#xff08;百度云、腾讯云&#xff09; AK/SK认证 (阿里云、天翼云、腾讯云) RSA非对称加密方式 &#xff08;信核云灾备&#xff09; Token认证 AK/SK认证 RSA认证 种方式使用一对密钥&#xff0c;即公钥和私钥。公钥可以公开&#x…

柳永,市井生活的吟游者

柳永&#xff0c;原名柳三变&#xff0c;字景庄&#xff0c;后改名为柳永&#xff0c;字耆卿&#xff0c;约生于宋太宗雍熙元年&#xff08;公元984年&#xff09;&#xff0c;卒于宋仁宗皇祐五年&#xff08;公元1053年&#xff09;&#xff0c;享年69岁。他是北宋著名词人&am…

基于eBPF的procstat软件追踪程序Offcpu时间

在现代计算机系统中&#xff0c;性能调优和问题诊断是大家经常会面临的问题&#xff0c;解决这些性能问题是确保程序高效运行的关键。有时不知为何程序的吞吐量和时延出现抖动&#xff0c;有一种可能就是程序发生了Offcpu。了解程序的 Offcpu 时间有助于识别潜在的性能瓶颈和系…

【论文速读】《面向深度学习的联合消息传递与自编码器》,无线AI的挑战和解决思路

这篇文章来自华为的渥太华无线先进系统能力中心和无线技术实验室&#xff0c;作者中有大名鼎鼎的童文。 一、自编码架构的全局收发机面临的主要问题 文章对我比较有启发的地方&#xff0c;是提到自编码架构的全局收发机面临的主要问题&#xff1a; 问题一&#xff1a;基于随…

Rhino云渲染使用教程

Rhino是一款功能强大、灵活易用的三维计算机图形建模软件&#xff0c;广泛应用于建筑、工业设计、产品设计、珠宝设计、动画制作等多个领域。哪Rhino可不可以使用云渲染呢&#xff1f;答案是可以的&#xff0c;下面给大家介绍一下炫云Rhino云渲染的使用方法。 1、搜索“炫云”…

springboot枚举简单使用笔记

springboot枚举简单使用笔记 定义枚举: package com.geofly.ynygzx.iscp.api.common.enums;/*** Description: 需求提交记录状态枚举** Param:* Return:* Author yanghaoxing* Date 2024/7/12 10:01*/public enum RequirementSubmissionStatus {BACK("已撤回", 0),S…

Java I/O模式 (一)

第一章 Java的I/O演进之路 1.1 I/O模型基本说明 1/0模型&#xff1a;就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收&#xff0c;很大程度上决定了程序通信的性能&#xff0c;Java 共支持3种网络编程的/10 模型&#xff1a;BIO、NIO、AIO 实际通信需求下&am…

Centos忘记密码,重置root密码

Centos忘记密码&#xff0c;重置root密码 操作环境&#xff1a;Centos7.6 1、选择包含rescue的选项&#xff0c;按e进入编辑模式 首先&#xff0c;我们需要重启系统&#xff0c;进入开机引导菜单界面。在这里&#xff0c;我们可以看到系统的内核版本和启动参数等信息。我们需…

【JavaEE精炼宝库】文件操作(2)——文件内容读写 | IO流

文章目录 一、输入流1.1 InputStream 概述&#xff1a;1.2 read 方法详解&#xff1a;1.3 close 方法&#xff1a;1.4 利用 Scanner 进行读操作&#xff1a;1.5 Reader&#xff1a; 二、输出流2.1 OutputStream 概述&#xff1a;2.2 write 方法详解&#xff1a;2.3 利用 PrintW…

学习测试8-数据库mysql操作

下载配置mysql 网络博客 使用 在Linux里 1 service mysql start 启动服务 2 在Navicatt 中连接Linux服务器 3 第一步 将所有文件上传到/opt目录下 第二步 chmod 777 deploy-mysql.sh 第三步 ./deploy-mysql.sh4 service mysql status 查看状态是否安装成功 5 重启mys…

Typescript 模块小知识-global scope

问题表现 在编写ts代码的时候遇到一个问题, 表现为, 如果在某个ts工程中, 如果多个文件里面没有任何导出export或者是export default, 那么这些文件如果有const或者是let定义相同的声明都会报错如下 无法重新声明块范围变量 a/a.ts 和 index.ts 和 index2.ts 都没有进行expor…

基于Redisson 实现 Redis 分布式锁

代码示例&#xff1a; GetMapping("/testJmeter")public void testJmeter() {synchronized (this){int stock Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"))if (stock > 0) {int realStock stock - 1;stringRedisTemplate.opsFo…

盘点:流媒体视频流协议与EasyCVR视频监控技术的深度融合

随着科技的不断进步&#xff0c;视频监控技术已经渗透到了社会的各个角落&#xff0c;从公共安全到企业运营&#xff0c;再到家庭安全&#xff0c;其应用范围日益广泛。而视频流格式作为视频监控技术的核心要素之一&#xff0c;其选择和应用对于确保视频传输的流畅性、清晰度和…

Python爬虫教程第3篇-解决使用reqeusts遇到的ProxyError异常

起因 问题出现在windows电脑上&#xff0c;我用mac执行程序的时候并不会报错&#xff0c;但是如果在windows上的时候&#xff0c;大部分windows电脑会报错&#xff0c;而有些版本低的windows电脑又不会报错。 异常栈信息 HTTPSConnectionPool, Cannot connect to proxy, no …

基于SpringBoot的校园疫情防控系统

你好&#xff0c;我是专注于计算机科学与技术的研究者。如果你对我的工作感兴趣或有任何问题&#xff0c;欢迎随时联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架&#xff0c;B/S架构 工具&#xff1a;Eclipse&#xff0c;Mav…

2024中国互联网大会 | 中国电信携手产业链伙伴推动低空经济行业创新与发展

低空经济是指以民用有人驾驶和无人驾驶航空器在低空空域内的各类飞行活动为牵引&#xff0c;辐射带动相关领域融合发展的综合经济形态。2024年全国两会&#xff0c;“低空经济”首次写入国务院政府工作报告。 赛迪顾问在《中国低空经济发展研究报告&#xff08;2024&#xff09…