探索c++——了解c++的魅力

前言:c++是一门既面向对象又面向过程的语言。 不同于java纯粹的面向对象和c纯粹的面向过程。 造成c++该特性的原因是c++是由本贾尼大佬在c的基础上增添语法创建出来的一门新的语言。 它既兼容了c, 身具面向过程的特性。 又有本身的面向对象的特性。 

面向对象和面向过程的区别:

我们可以以将大象关进冰箱为例子。 如果是c语言的话。它只会关注将大象关进冰箱的过程——打开冰箱门, 将大象关进冰箱, 关闭冰箱。但如果是c++的话,它会关注解决这个问题的对象——人, 大象, 冰箱。 

然后c语言的函数解决的就是每一步骤如何做才能将大象装进行冰箱。c++的函数就是定义在对象的类里作为成员函数,作为这个对象解决问题的手段, 方法。

目录

命名空间

域操作符

展开命名空间

c++的输入和输出

缺省参数

 函数重载

引用

内联函数

空指针nullptr


命名空间

命名空间解决的是变量重命名的问题。 在c语言中,当我们向定义一个变量, 这个变量的变量名和库中的函数或者其他重复了。

#include<stdlib.h>

int main()
{
    int rand;//这时会和stdlib.h中的rand生成随机数函数重复。 c语言除了将变量名改掉没有办法。
    return 0;
}

 可能这个问题你认为只要改一下变量名就好了。但是如果是在公司之中。 那个时候许多人共同开发一个程序。 不可避免地会有变量名重复的问题。 如果事先商量好说“谁谁谁这么取名, 谁谁谁那么取名。”或者说如果两个人定义的变量名冲突后就商议一下谁改掉谁的程序中所有的这个变量的变量名。 这个就太烦了。 所以本贾尼大佬针对这个问题就创建出来了命名空间, 有效的解决了这个问题。 

域操作符

namespace name
{
	int A() 
	{
		return 1;
	}
}

int main() 
{
	int A = 0;//因为A函数是在命名空间name中定义的。 所以函数A不会和这里的变量A重命名。

	cout << A << endl;

	return 0;
}


想要使用命名空间内的函数或者变量。 有两种方法:一种是使用“::”作用域操作符一种是直接将作用域展开。

namespace name
{
	int A() 
	{
		return 1;
	}
}


int main() 
{
	//int A = 0;//因为A函数是在命名空间name中定义的。 所以函数A不会和这里的变量A重命名。
	name::A();//::前面加作用域, 如果是全局就不写作用域


	return 0;
}

::前面加作用域, 如果是全局就不写作用域

这里打印的A前面加了域操作符。 且查找的是全局

展开命名空间

我们正常情况下直接包含头文件

#include<iostream>

int main() 
{

	int i = 0;
	cout << i << endl;//编译不过

	return 0;
}

这样是编译不过的, 因为cout 和 endl都被包含在std命名空间中。 std命名空间就是c++的标准库命名空间。 

想要使用cout 和endl必须用与操作符在std中寻找使用。 或者直接将std展开

#include<iostream>
using namespace std;//using 就是展开空间

int main() 
{

	int i = 0;
	cout << i << endl;//此时可以编过

	return 0;
}

using就是命名空间展开的关键字。 using后面加命名空间就可以将一个命名空间展开。 或者加命名空间中的一个函数或其他成员。 意思就是将其从命名空间中展开到全局。 


#include<iostream>
using std::cout;
using std::endl;

int main() 
{

	int i = 0;
	cout << i << endl;//编译不过

	return 0;
}

 这样也可以, 这样只展开了cout和endl。

c++的输入和输出

从上面我们已经看到了输出 对象"cout", 它是标准输出对象终端, 或者说是控制台。 

然后我们再看一下输入 "cin",它是标准输入对象

<< 是流插入操作符。 "cout << 数据" 的意思就是将数据输出到终端, 好处就是自行判断输出数据的类型。 

>> 是流提取操作符。"cin >> 内存"的意思就是将流中的数据输入到内存中, 好处也是自行判断格式,不需要自行判断

endl标识换行输出。 

以上都包含在iostream头文件中的std命名空间中。

缺省参数

#include<iostream>
using namespace std;
int Add(int x = 0, int y = 0) 
{
	return x + y;
}

int main() 
{
	int a = 1;
	int b = 1;

	int ret1 = Add();//输出0
	int ret2 = Add(a, b);//输出2

	cout << ret1 << "\n" << ret2 << endl;


	return 0;
}

当我们调用函数时没有进行传参时, 函数如果定义了缺省参数, 那么这个被调用的函数就会使用缺省参数。 

如图中

 这个int x = 0, int y = 0就是缺省参数定义的方式。 

然后, 当我们传参时如果没有传参, 就像图中的第一次调用

这个时候就会使用缺省参数。 x 为0, y 也是0。所以计算出来的就是0。

上面定义的是全缺省参数定义缺省参数时也可以半缺省

#include<iostream>
using namespace std;
int Add(int x, int y = 0) 
{
	return x + y;
}

int main() 
{
	int a = 1;
	int b = 1;

	int ret1 = Add(a);//输出1

	cout << ret1 << endl;


	return 0;
}

半缺省参数是从右向左定义的 ,向这个图中的Add函数就是定义的y为半缺省。 注意不能定义x为半缺省。定义半缺省要从右向左!

 函数重载

c++函数重载是很重要的一个知识点。就是说可以同时存在多个同名的函数。只要他们的参数个数不同或者参数的类型不同,或类型顺序不同这时, 这些函数就构成函数重载。

#include<iostream>
using namespace std;
int Add(int x, int y) //这两Add函数构成函数重载
{
	return x + y;
}

double Add(double x, double y) //
{
	return x + y;
}

int main() 
{

	int ret1 = Add(1, 2);
	
	double ret2 = Add(1.1, 2.2);
	cout << ret1 << " " << ret2 << endl;

	return 0;
}

这串代码中两个Add函数就构成了函数重载。 因为他们的参数类型不同。

注意:编译器这里分辨不同函数不是通过返回类型。 而是通过参数类型 参数个数不同类型参数顺序。它的分辨本质就是将函数转函数一种符号表的形式。 

假如

转化后就类似于:Addii  ,这里的Add是函数名。 ii是标识两个类型。i是int首字母。

这个就转换为Adddd, Add同样是函数名, dd是两个类型。 d是double首字母

这里的具体转换规则是什么我并不清楚。 只是意思就是这个意思。 有兴趣的话可以去查找相关资料

引用

大件来了!

引用, 为了避免使用指针而创造出来的一个类似于指针的语法。

引用就是一个变量的别名。 

 引用是变量的别名。 我们可以想象a 和 b共同代表着一个空间a的数据改变。 b也就改变了。

有了引用后, 我们交换函数就有了另一种定义方法:

这里形参x 是a的别名,语法上x就是ay是b的别名,语法上y就是b。所以交换x和y的值, 就交换了a和b的值。 

内联函数

内联函数inline + 函数定义

内联函数宏定义函数对应。 

宏定义在预处理阶段通过代码替换。来达到简单的函数的作用,提高行能。但是宏也有没有类型检查无法调试等缺点。

内敛函数在拥有着宏定义的优点:同样不用调用函数,直接将代码在原调用位置展开,提高性能。 

内联函数是在编译阶段,将函数体在原调用位置展开。 

内联函数不能将声明和定义定义在不同的文件之中。 否则可能报错。 

对于内联函数, 一般建议函数规模较小不是递归不是频繁调用。 否则编译器可能不会将内联函数展开, 而是直接调用内联函数

空指针nullptr

空指针nullptr是为了弥补NULL的错误。 

NULL可能标识空地址。 但是也有可能标识0.但是nullptr只有一种含义:无类型的地址0。

注:nullptr是c++11引入的关键字。 不需要包含头文件。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot集成ElasticSearch(ES)

ElasticSearch环境搭建 采用docker-compose搭建&#xff0c;具体配置如下&#xff1a; version: 3# 网桥es -> 方便相互通讯 networks:es:services:elasticsearch:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/elasticsearch:7.14.1 # 原镜像elasticsearch:7.…

Unity 整体界面淡入淡出效果

在Unity中&#xff0c;如果我们要实现控制多个组件同时淡出&#xff0c;同时淡入的效果&#xff0c;可以使用DOTween插件实现。 如图&#xff0c;一个页面中带有背景&#xff0c;一张图片&#xff0c;一个文本&#xff0c;一个滑动条。 要实现以上界面的整体淡入淡出&#xff…

机器学习-启航

文章目录 原理分析机器学习的两种典型任务机器学习分类总结数据机器学习分类解读简单复杂 原理分析 马克思主义哲学-规律篇 规律客观存在&#xff0c;万事万物皆有规律。 机器学习则是多维角度拆解分析复杂事实数据&#xff0c;发现复杂事实背后的规律&#xff0c;然后将规律用…

C#,回文分割问题(Palindrome Partitioning Problem)算法与源代码

1 回文串 “回文串”是一个正读和反读都一样的字符串&#xff0c;初始化标志flagtrue&#xff0c;比如“level”或者“noon”等等就是回文串。 2 回文分割问题 给定一个字符串&#xff0c;如果该字符串的每个子字符串都是回文的&#xff0c;那么该字符串的分区就是回文分区。…

VS code下载与使用方法(包含远程调试)

Visual Studio Code(简称 VSCode)是由微软开发的一款免费、开源、跨平台的现代化轻量级代码编辑器。它具有丰富的功能和强大的扩展性,适用于多种编程语言和开发环境。以下是 VSCode 的一些主要特点和功能: 跨平台支持: 可在 Windows、macOS 和 Linux 等多种操作系…

基于ACM32 MCU的两轮车充电桩方案,打造高效安全的电池管理

随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及&#xff0c;越来越多的人选择了电动车作为代步工具&#xff0c;而两轮电动车的出行半径较短&#xff0c;需要频繁充电&#xff0c;因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决两轮车…

Flink:Temporal Table 的两种实现方式 Temporal Table DDL 和 Temporal Table Function

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

近地面无人机植被定量遥感与生理参数反演技术应用

李老师&#xff08;副教授&#xff09;&#xff0c;长期从事无人机近地面植被遥感&#xff0c;植被生理参数&#xff0c;多角度遥感&#xff0c;RGB/多光谱/高光谱数据处理&#xff0c;LiDAR点云处理等领域研究工作&#xff0c;具有资深的技术底蕴和专业背景。 专题一、近十年…

java 获取项目内的资源/配置文件

【getResourceAsStream】是java中用于获取项目内资源的常用方法&#xff0c;能够返回一个数据流&#xff0c;从而允许我们读取指定路径下的资源文件。这个方法可以用来读取各种类型的资源文件&#xff0c;包括但不限于文本文件、图像文件、配置文件等。 要使用getResourceAsStr…

InfluxDB SHOW SERIES语句按照什么顺序返回?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言样例SHOW SERIES比较原理结论结束语 引言 influxdb的计算引擎为了做到自底而上的…

【Web安全靶场】upload-labs-master 1-21

upload-labs-master 其他靶场见专栏… 文章目录 upload-labs-masterPass-01-js前端校验Pass-02-MIME校验Pass-03-其他后缀绕过黑名单Pass-04-.hatccess绕过Pass-05-点空格点代码逻辑绕过Pass-06-大小写绕过Pass-07-空格绕过Pass-08-点号绕过Pass-09-::$DATA绕过Pass-10-点空格…

三、代码结构(不定时更新)

一、装饰器 Entry&#xff1a;标记当前组件是入口组件 Component&#xff1a;标记自定义组件 State&#xff1a;标记该变量是状态变量&#xff0c;值变化时会触发UI刷新 二、自定义组件 // 可复用的UI单元 struct Index {} 三、UI描述 // 其内部以声明式方式描述UI结构 bu…

fatal: unable to access ‘***‘: OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0解决方案

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文主要介绍在从 GitHub 上克隆 stable-diffusion-webui 项目时出现的 fatal: unable to access https://github.com/AUTOMATIC1111/stable-diffusion-webui.…

【STM32】HAL库 CubeMX教程---通用定时器 定时

STM32常用型号的TIM时钟频率 1. STM32F103系列&#xff1a; 所有 TIM 的时钟频率都是72MHz&#xff1b;F103C8不带基本定时器&#xff0c;F103RC及以上才带基本定时器。 2、STM32F407系列&#xff1a; TIM1、8、9、10、11的时钟频率是168MHz&#xff1b;其它TIM的时钟频率是…

【PHP】PHP通过串口与硬件通讯,向硬件设备发送数据并接收硬件返回的数据

一、前言 之前写过两篇PHP实现与硬件串口交互的文章&#xff0c;一篇是【PHP】PHP实现与硬件串口交互&#xff0c;接收硬件发送的实时数据&#xff08;上&#xff09;_php串口通信-CSDN博客&#xff0c;另一篇是【PHP】PHP实现与硬件串口交互&#xff0c;向硬件设备发送指令数…

阿里云2核4G服务器支持人数并发测试,2核4G主机测评

阿里云2核4G服务器多少钱一年&#xff1f;2核4G配置1个月多少钱&#xff1f;2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

C++ LRU缓存

题目&#xff1a; //构建双向链表的节点结构&#xff08;要有两个构造函数&#xff09; struct Node{int key, val;Node* pre;Node* next;Node():key(0), val(0), pre(nullptr), next(nullptr) {}Node(int _key, int _val): key(_key), val(_val), pre(nullptr), next(nullpt…

基础小白快速入门web前端开发技术------>web概述

Web概述 我们在编程的学习中&#xff0c;随着学习的深入&#xff0c;我们会理解到WEB这个东西&#xff0c;那么 web究竟是个啥&#xff0c;到底该咋用&#xff1f; web&#xff0c;是网站的英文意思&#xff0c;又被称作“下一代Web3.0&#xff0c;互联网”&#xff0c;是在We…

简洁实用的wordpress外贸网站模板

坚果蜜饯wordpress跨境电商模板 木瓜干、菠萝干、夏威夷果、芒果干、椰片、巴旦木等wordpress跨境电商模板。 https://www.jianzhanpress.com/?p3944 珠宝手饰wordpress外贸网站模板 金银手饰、珍珠手饰、翡翠手饰、钻石手饰、玉石珠宝手饰wordpress外贸网站模板。 https:…

docker无法运行问题

场景如下&#xff1a; 执行运行docker命令出现如下错误&#xff1a;systemctl start docker 出现该问题的原因&#xff1a;是因为我们配置的镜像加速器用不了了 去修改我们的镜像加速器&#xff0c; 去到配置镜像加速器的目录 cd /etc/docker 修改镜像加速器 vim daemon.j…