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

news2025/1/21 12:15:50

前言: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引入的关键字。 不需要包含头文件。 

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

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

相关文章

golang中go build 后读取配置文件

golang打包后读取配置文件 在用go写代码的时候&#xff0c;为了好用经常使用go build 打包&#xff0c;如果我们用到了配置文件&#xff0c;就总是导致不能找到文件所在位置了出现bug&#xff0c;所以以下代码就解决了这个问题。 核心代码&#xff1a; file, err : exec.Look…

【打工日常】Linux实现可回滚的回收站功能

1.为什么创建可回滚的回收站功能&#xff1f; 为了让运维人员可以有回旋的余地&#xff0c;但是也要保证可以清理不需要的文件。 2.涉及到的文件安全概念&#xff1f; Linux的文件安全概念主要涉及到文件权限和文件系统安全两个方面。 那什么是文件权限&#xff1f; 在Linux系统…

第三百八十六回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口&#xff0c;只不过窗口的内容固定显示…

LeetCode142题:环形链表II(python3)

代码思路&#xff1a; 双指针的第一次相遇&#xff1a; 设两指针 fast&#xff0c;slow 指向链表头部 head 。 令 fast 每轮走 2 步&#xff0c;slow 每轮走 1 步。 fast 指针走过链表末端&#xff0c;说明链表无环&#xff0c;此时直接返回 null。 如果链表存在环&#xff0c;…

点胶缺陷视觉检测都是怎么检测的?

点胶工艺是许多工业生产中不可或缺的一环&#xff0c;而点胶缺陷的存在往往直接影响到产品质量。为了提升点胶工艺的品质控制&#xff0c;点胶缺陷的视觉检测成为了一个重要的技术手段。 一、点胶缺陷的类型 点胶缺陷主要包括胶点大小不均、位置偏移、漏点、多点等。这些缺陷如…

【Python爬虫实战】抓取省市级城市常务会议内容

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

引入AndroidUSBCamera-master USB摄像头问题

1&#xff0c;USB摄像头地址 GitHub - jiangdongguo/AndroidUSBCamera: &#x1f525;&#x1f525;&#x1f525;Flexible and useful UVC camera engine on Android platform, supporting multi-road cameras! 2&#xff0c;下载zip包 引入操作&#xff1a; 1&#xff0c;…

Cloud-Sleuth分布式链路追踪(服务跟踪)

简介 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果,每一个前端请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败 GitHub - spring-cloud/spring-cloud-sl…

第41期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

政安晨:【深度学习处理实践】(一)—— 卷积神经网络入门

深度学习的卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称CNN&#xff09;是一种广泛应用于图像识别、计算机视觉和自然语言处理等领域的深度学习模型。 CNN的主要特点是它能够自动从原始数据中学习特征表示&#xff0c;而无需手动特征工程。这是通过…

leetcode 热题 100_合并区间

题解一&#xff1a; 排序&#xff1a;先将区间按左边界从小到大进行排序&#xff0c;假设排序后a区间在b区间之前&#xff0c;根据a区间右边界和b区间左边界的大小判断是否重叠&#xff0c;如果重叠则将区间合并为一个。考虑到区间完全处于另一区间内的情况&#xff0c;合并时应…

vue3的基本使用(1)

Vue3的基本使用&#xff08;1&#xff09; 初识vue31. vue3简介2. 性能提升3. 源码升级 Vue3的创建1. vue-cli创建2. vite创建 Composition API的区别&#xff08;组合式&#xff09;setup函数响应式数据1. ref响应式2. reactive响应式 toRefs与toRef简单介绍 初识vue3 1. vue…

阿里云一键登录(号码认证服务)

前言 用户登录原来的登录方式如下 1. 手机号验证码 2. 账号密码 运营觉得操作过于复杂, 因此想引入阿里自动登录的逻辑, 也就是号码认证服务,所以才有了这篇问文章 注: 本文只是记录Java端的实现, app端的请自行查询文档实现 官方资料 文档 : 什么是号码认证服务_号码认证服务(…

Flink学习4 - 富函数 + 数据重分区操作 + sink 操作(kafka、redis、jdbc)

1、富函数 - 函数类接口&#xff0c;可以获取运行环境的上下文&#xff0c;实现更复杂的功能 2、数据重分区操作 3、sink操作 sink - kafka 1、引入kafka的pom依赖 <dependency><groupId>org.apache.flink</groupId> <!--<artifactId>flink-conn…

【漏洞复现】网康科技 NS-ASG 应用安全网关 SQL注入漏洞(CVE-2024-2022)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

获得店铺的所有商品API接口

使用淘宝淘口令接口的步骤通常包括&#xff1a; 注册成为淘宝开放平台的开发者&#xff1a;在淘宝开放平台网站上注册账号并完成认证。 创建应用以获取API密钥&#xff1a;在您的开发者控制台中创建一个应用&#xff0c;并获取用于API调用的密钥&#xff0c;如Client ID和Clie…

工业以太网交换机助力电力综合自动化系统卓越运行

随着电力行业不断迈向数字化和自动化时代&#xff0c;电力综合自动化系统逐渐成为实现电网智能化管理的核心。在这一复杂而庞大的系统中&#xff0c;工业以太网交换机扮演着至关重要的角色&#xff0c;连接着各种智能设备&#xff0c;实现数据的快速传输和高效管理&#xff0c;…

【python基础学习10课_面向对象、封装、继承、多态】

一、类与对象 1、类的定义 在类的里面&#xff0c;称之为方法。 在类的外面&#xff0c;称之为函数。类&#xff1a;人类&#xff0c;一个族群&#xff0c;是一个群体类的语法规则&#xff1a;class 自定义的类名():属性 -- 变量方法 -- 函数类&#xff0c;首字母大写&#x…

Json web token (JWT)渗透与防御及ctf例题

第三部分的signature签名用来认证签名是否被更改 算法为none是因为开发人员为了更方便的修改&#xff0c;把header部分设置为none&#xff0c;从而不用进行第三部分签名的认证。 注&#xff1a;一定要先切换到jwt_tool目录下面使用 还可以使用-c -d参数使用自带的字典进行爆破密…

如何做代币分析:以 USDC 币为例

作者&#xff1a; lesleyfootprint.network 编译&#xff1a;mingfootprint.network 数据源&#xff1a; USDC Token Dashboard &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作用。代币分析指的是深入研究与代币相…