【C++】入门基础知识-1

🍬个人主页:Yanni.—

🌈数据结构:Data Structure.​​​​​​

🎂C语言笔记:C Language Notes

🏀OJ题分享: Topic Sharing

目录

前言:

C++关键字

命名空间 

命名空间介绍

命名空间的使用

C++的输入和输出 

cout 输出

cin 输入

std命名空间的使用惯例

缺省参数

缺省参数概念

缺省参数分类

函数重载

函数重载概念

为什么c语言不支持重载


前言:

企业中面试中一般需要面向对象的两种主流语言C++和Java,现在java岗位虽然多,但是内卷严重,经过很长时间的思考,还是选择了C++,可能以后还会进入游戏开发的领域,这恰恰是我感兴趣的,C++前期的基础知识很难,但是过了这道难关之后情况会越来越来。Let's go!

C++关键字

C++ 总计 63 个关键字, C 语言 32 个关键字。

这里在C语言的基础上增加了许多关键字。

命名空间 

命名空间介绍

C/C++ 中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存
在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是 对标识符的名称进行本地化
避免命名冲突或名字污染 namespace 关键字的出现就是针对这种问题的。
#include<stdio.h>
#include<stdlib.h>int rand = 10;int main()
{printf("%d", rand);return 0;
}

我们直到rand产生随机值,但是我们给出了一个全局变量rand,并且赋值了给它。这就导致:

 “rand”: 重定义;以前的定义是“函数”。所以我们得避免命名冲突或名字污染。

命名冲突主要有两个:

1.库冲突

2.项目间,同时工作交接之间的互相命名冲突

因此定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。

#include<stdio.h>
#include<stdlib.h>namespace Yanni
{int rand = 10;
}int main()
{printf("%d", Yanni::rand);return 0;
}

命名空间的三个特性:

1.命名空间中可以定义变量/函数/类型。

2.命名空间可以嵌套。

3.同一个工程中是允许多种同名称的命名空间存在,编译器最后会成同一个命名空间内。

命名空间的使用

命名空间的使用主要有三种方式

1.加命名空间名称及作用域限定符

namespace Yanni // 命名空间名
{int r = 10;
}
int main()
{printf("%d", Yanni::r);return 0;
}

2.使用using将命名空间中某个成员引入

namespace Yanni
{int r = 10;
}
using Yanni::r;
int main()
{printf("%d",r);return 0;
}

这个操作就想是将命名空间里的特定成员变成全局访问。 

 3.使用 using namespace 命名空间名称引入

namespace Yanni
{int r = 10;
}
using namespace Yanni;
int main()
{printf("%d",r);return 0;
}

这就是将命名空间内的所有成员变成全局访问。

C++的输入和输出 

cout 输出

#include<iostream>
//std是C++标准库的命名空间名,C++将标准库的定义都放到这个命名空间中。
using namespace std;int main()
{cout << "hello world" << endl;//endl相当与换行符return 0;
}
说明:
1. 使用 cout 标准输出对象 ( 控制台 ) cin 标准输入对象 ( 键盘 ) 时,必须 包含 < iostream > 头文件 以及按命名空间使用方法使用std
2. cout cin 是全局的流对象, endl 是特殊的 C++ 符号,表示换行输出,他们都包含在包含 <iostream >头文件中。
3. << 是流插入运算符, >> 是流提取运算符
4. 使用 C++ 输入输出更方便,不需要像 printf/scanf 输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型。
5. 实际上 cout cin 分别是 ostream istream 类型的对象, >> << 也涉及运算符重载等知识, 这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有 一个章节更深入的学习IO 流用法及原理。
注意:早期标准库将所有功能在全局域中实现,声明在 .h 后缀的头文件中,使用时只需包含对应
头文件即可,后来将其实现在 std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,
规定 C++ 头文件不带 .h ;旧编译器 (vc 6.0) 中还支持 <iostream.h> 格式,后续编译器已不支持,因
推荐 使用 <iostream>+std 的方式。

cin 输入

在c语言中,我们定义变量都需要对变量进行初始化,而在C++中,就不需要初始化了,因为cin>>可以自动识别变量类型。

#include<iostream>
//std是C++标准库的命名空间名,C++将标准库的定义都放到这个命名空间中。
using namespace std;int main()
{int a;double b;char c;cin >> a;cin >> b >> c;cout << a << b << c << endl;return 0;
}

std命名空间的使用惯例

std C++ 标准库的命名空间,如何展开 std 使用更合理呢?
1. 在日常练习中,建议直接 using namespace std 即可,这样就很方便。
2. using namespace std 展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型 / 对 象/ 函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模 大,就很容易出现。所以建议在项目开发中使用,像std::cout 这样使用时指定命名空间 + using std::cout展开常用的库对象 / 类型等方式。

缺省参数

缺省参数概念

缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值 。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参。
using namespace std;void Func(int a = 0)
{cout << a << endl;
}
int main()
{Func();没有传参时,使用参数的默认值Func(10);传参时,使用限定的实参
}

缺省参数分类

全缺省参数

void Func(int a = 0,int b = 10,int c = 20)
{cout << a << endl;cout << b << endl;cout << c << endl;
}

半缺省参数

void Func(int a, int b = 10, int c = 20)
{cout << a << endl;cout << b << endl;cout << c << endl;
}

这里要注意的是:

1.半缺省参数必须从右往左依次来给出,不能间隔着给(传参的顺序的从左到右)

2.缺省参数不能再函数声明和定义中同时出现

3.缺省值必须是常量或者全局变量

4.c语言编译器不支持

函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重
载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个
是男足。前者是 谁也赢不了! ,后者是 谁也赢不了“。

函数重载概念

函数重载: 是函数的一种特殊情况, C++ 允许在 同一作用域中 声明几个功能类似 的同名函数 ,这
些同名函数的 形参列表 ( 参数个数 或 类型 或 类型顺序 ) 不同 ,常用来处理实现功能类似数据类型
不同的问题。
1.参数类型不同
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}

2.参数个数不同

void Func()
{cout << "void Func()" << endl;
}void Func(int a)
{cout << "void Func(int a)" << endl;
}

3.参数类型顺序不同

void F(int a, char b)
{cout << "void F(int a, char b)" << endl;
}void F(char b, int a)
{cout << "void F(char b, int a)" << endl;
}

为什么c语言不支持重载

C/C++ 中,一个程序要运行起来,需要经历以下几个阶段: 预处理、编译、汇编、链接。
1. 实际项目通常是由多个头文件和多个源文件构成,而通过 C 语言阶段学习的编译链接,我们
可以知道,【当前 a.cpp 中调用了 b.cpp 中定义的 Add 函数时】,编译后链接前, a.o 的目标
文件中没有 Add 的函数地址,因为 Add 是在 b.cpp 中定义的,所以 Add 的地址在 b.o 中。那么
怎么办呢?
2. 所以链接阶段就是专门处理这种问题, 链接器看到 a.o 调用 Add ,但是没有 Add 的地址,就
会到 b.o 的符号表中找 Add 的地址,然后链接到一起 ( 老师要带同学们回顾一下 )
3. 那么链接时,面对 Add 函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的
函数名修饰规则。
4. 由于 Windows vs 的修饰规则过于复杂,而 Linux g++ 的修饰规则简单易懂,下面我们使
用了 g++ 演示了这个修饰后的名字。
5. 通过下面我们可以看出 gcc 的函数修饰后名字不变。而 g++ 的函数修饰后变成【 _Z+ 函数长度
+ 函数名 + 类型首字母】。

 结论:在Linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改的名字中。

好啦,这就是今天学习的分享啦!看到希望大家的三连呀!

如果有不当之处,欢迎大佬指正!

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

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

相关文章

使用 Llama-index 实现的 Agentic RAG-Router Query Engine

前言 你是否也厌倦了我在博文中经常提到的老式 RAG(Retrieval Augmented Generation | 检索增强生成) 系统&#xff1f;反正我是对此感到厌倦了。但我们可以做一些有趣的事情&#xff0c;让它更上一层楼。接下来就跟我一起将 agents 概念引入传统的 RAG 工作流&#xff0c;重新…

凌晨1点开播!Meta Connect 2024开发者大会,聚焦Llama新场景和AR眼镜

作者&#xff1a;十九 编辑&#xff1a;李宝珠 北京时间 9 月 26 日凌晨 1 点&#xff0c;Meta Connect 2024 开发者大会即将举行&#xff0c;马克扎克伯格将聚焦 AI 和元宇宙&#xff0c;向大家分享 Llama 模型的更多潜在应用&#xff0c;并介绍 Meta 最新产品 AR 眼镜和 Meta…

OceanBase云数据库战略实施两年,受零售、支付、制造行业青睐

2022年OceanBase推出云数据库产品OB Cloud,正式启动云数据库战略。两年来OB Cloud发展情况如何&#xff0c;9月26日&#xff0c;OceanBase公有云事业部总经理尹博学向记者作了介绍。 尹博学表示&#xff0c;OB Cloud推出两年以来&#xff0c;已服务超过700家客户&#xff0c;客…

Pydantic 是一个强大的 Python 库

Pydantic 是一个强大的 Python 库&#xff0c;专门用于数据验证和设置管理。以下是对 Pydantic 的详细介绍&#xff1a; 一、主要功能和特点 数据验证&#xff1a; Pydantic 通过 Python 类型注解来定义数据模型&#xff0c;并自动验证输入数据是否符合预定义的类型和结构。提…

智算中心动环监控:构建高效、安全的数字基础设施@卓振思众

在当今快速发展的数字经济时代&#xff0c;智算中心作为人工智能和大数据技术的核心支撑设施&#xff0c;正日益成为各行业实现智能化转型的重要基石。为了确保这些高性能计算环境的安全与稳定&#xff0c;卓振思众动环监控应运而生&#xff0c;成为智算中心管理的重要组成部分…

计算机知识科普问答--19(91-95)

文章目录 91、为什么会产生死锁?什么是死锁?死锁产生的四个必要条件信号量机制中的死锁原因示例:可能导致死锁的信号量使用如何避免死锁在之前的信号量问题中如何避免死锁【2011年408真题】银行系统示例缓冲区问题示例具体示例:避免死锁的代码设计顾客进程 \( P_{\text{cus…

理解Java引用数据类型(数组、String)传参机制的一个例子

目录 理解Java引用数据类型&#xff08;数组、String&#xff09;传参机制的一个例子理解样例代码输出 参考资料 理解Java引用数据类型&#xff08;数组、String&#xff09;传参机制的一个例子 理解 引用数据类型传递的是地址。用引用类型A给引用类型B赋值&#xff0c;相当于…

[半导体检测-5]:软件离线许可(License)的基本原理

目录 前言&#xff1a; 一、软件离线许可的基本概念 二、实现原理 1. 数字签名技术 2. 授权信息包含内容 3. 时间戳验证 三、实际应用与操作建议 1. 离线许可的分配与安装 2. 常见问题与解决方法 四、总结 前言&#xff1a; 在软件行业&#xff0c;离线许可&#xf…

【自动驾驶】ros如何隔绝局域网内其他电脑播包

1.问题 可能碰到自己播包的时候&#xff0c;别人播包的传到我们电脑上&#xff0c;导致无法分析问题&#xff0c;或者出现一些奇怪的现象。 2.解决 export ROS_LOCALHOST_ONLY1 在终端加上这句话&#xff0c;或者在~/.bashrc中添加&#xff0c;通过source ~/.bashrc使其生…

Java 入门指南:获取对象的内存地址

文章目录 hashCode()应用重写 hashCode() 方法示例 Symstem . indentityHashCode()应用 注意事项 在 Java 开发中&#xff0c;了解对象的内存管理是十分重要的&#xff0c;尽管 Java 的设计初衷是让开发者更专注于业务逻辑而非底层资源管理。但在某些情况下&#xff0c;了解对象…

Linux(含麒麟操作系统)如何实现多显示器屏幕采集录制

技术背景 在操作系统领域&#xff0c;很多核心技术掌握在国外企业手中。如果过度依赖国外技术&#xff0c;在国际形势变化、贸易摩擦等情况下&#xff0c;可能面临技术封锁和断供风险。开发国产操作系统可以降低这种风险&#xff0c;确保国家关键信息基础设施的稳定运行。在一…

【C++位图】构建灵活的空间效率工具

目录 位图位图的基本概念如何用位图表示数据位图的基本操作setresettest 封装位图的设计 总结 在计算机科学中&#xff0c;位图&#xff08;Bitmap&#xff09;是一种高效的空间管理数据结构&#xff0c;广泛应用于各种场景&#xff0c;如集合操作、图像处理和资源管理。与传统…

一文读懂 Pencils Protocol 近期不可错过的市场活动

Pencils Protocol 是 Scroll 上综合性的 DeFi 协议&#xff0c;自 9 月 18 日开始其陆续在 Tokensoft、Bounce、Coresky 等平台开启 DAPP 通证的销售&#xff0c;并分别在短期内完成售罄。吸引了来自韩国、CIS、土耳其等 70 多个国家的 5 万多名认证用户&#xff0c;反响热烈&a…

Jmeter关联,断言,参数化

一、关联 常用的关联有三种 1.边界提取器 2.JSON提取器 3.正则表达式提取器 接下来就详细讲述一下这三种的用法 这里提供两个接口方便练习 登录接口 接口名称&#xff1a;登录 接口提交方式&#xff1a;POST 接口的url地址&#xff1a;https://admin-api.macrozheng.com/a…

Python中的文件编码:揭开字符世界的神秘面纱

引言 在计算机系统中&#xff0c;数据是以二进制形式存储的。而我们日常见到的文字、符号等信息&#xff0c;则需要通过特定的方式转化为二进制数据&#xff0c;这就是编码的过程。不同的编码方式决定了如何将字符映射成字节序列。选择合适的编码方案不仅能够保证信息传输的准…

C#常用数据结构栈的介绍

定义 在C#中&#xff0c;Stack<T> 是一个后进先出&#xff08;LIFO&#xff0c;Last-In-First-Out&#xff09;集合类&#xff0c;位于System.Collections.Generic 命名空间中。Stack<T> 允许你将元素压入栈顶&#xff0c;并从栈顶弹出元素。 不难看出&#xff0c;…

Oracle 单机和集群环境部署教程

目录 一、Oracle 单机环境部署1. 环境准备2. 安装 Oracle Database2.1 下载 Oracle Database2.2 创建 Oracle 用户和组2.3 配置内核参数和系统限制2.4 解压和安装2.5 配置监听程序2.6 创建数据库 3. 单机部署注意事项 二、Oracle 集群环境部署 (Oracle RAC)1. 环境准备2. 安装 …

SpringBoot-Starter2.7.3自动装配Redisson升级版本运行时的问题

序言 在github上搜索redisson官方源码中的issue其他伙伴们提交的记录。 https://github.com/spring-projects/spring-data-redis/tree/main/src/main/java/org/springframework/data/redis/connection/zset 基础工程的pom文件中的依赖结构 springboot version <depende…

“跨链桥“的危害

跨链桥&#xff08;Cross-Chain Bridges&#xff09;是连接不同区块链网络的工具&#xff0c;允许用户在不同的区块链之间转移资产和数据。尽管跨链桥为区块链生态系统带来了许多便利&#xff0c;但它们也存在一些潜在的危害和风险。以下是一些主要的危害&#xff1a; 1. 安全…

【Webpack】实现持久化缓存

回答重点 在 Webpack 中实现持久化缓存有几个关键策略&#xff0c;最核心的就是利用文件内容哈希&#xff0c;使得文件名发生变化&#xff0c;这样浏览器就会识别为新的资源而不是使用缓存的旧资源。具体步骤如下&#xff1a; 1&#xff09;使用 output.filename 和 output.c…