[C++初阶] 爱上C++ : 与C++的第一次约会

news2024/11/30 11:52:11

Alt
🔥个人主页guoguoqiang 🔥专栏我与C++的爱恋

Alt

本篇内容带大家浅浅的了解一下C++中的命名空间。
在c++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突性的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入关键字namespace(命名空间/名字空间/名称空间),可以更好地控制标识符的作用域。

​ 一、命名空间

举例

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

而为什么会出现这样的情况呢?是因为在C语言中的stdlib.h中的rand函数和我们定义的变量冲突了,这种情况在C语言中我们只能通过改变参数的名字来解决这种情况,但是在C++完全不用担心这种情况,因为C++中有着命名空间namespace来严格管控函数。
什么是命名空间呢?
命名空间就是通过定义一个空间来封装变量,函数,是一种用来给变量和函数等标识符起一个独特且有组织的名称的机制。通过使用命名空间,可以避免在不同的代码模块中出现重名的标识符,从而提高代码的可读性和可维护性。

1 命名空间的定义

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

// 1. 正常的命名空间定义
namespace bit
{
// 命名空间中可以定义变量/函数/类型
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
2.2 命名空间使用
命名空间中成员该如何使用呢?比如:
struct Node
{
struct Node* next;
int val;
};
}
//2. 命名空间可以嵌套
// test.cpp
namespace N1
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace N2
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个
// test.h
namespace N1
{
int Mul(int left, int right)
{
return left * right;
}
}

2.命名空间使用

命名空间中成员该如何使用呢?

namespace bit
{
// 命名空间中可以定义变量/函数/类型
int a = 0;
int b = 1;
int Add(int left, int right)
{
return left + right;
3. C++输入&输出
}
struct Node
{
struct Node* next;
int val;
};
}
int main()
{
// 编译报错:error C2065: “a”: 未声明的标识符
printf("%d\n", a);
return 0;
}

命名空间中还可以定义结构体:

#include <iostream>
using namespace std;
namespace guoguo {
	typedef struct STlist {
		int val;
		int capicity;
	}STL;
}
int main() {
	guoguo::STL a;
	guoguo::STL n1;
	a.val = 10;
	n1.val = 20;
	cout << a.val << endl;
	cout << n1.val << endl;
}

在这里插入图片描述


> 命名空间的使用有三种方式:
> 1.加命名空间名称及作用域限定符   N::a
> 2.使用using将命令空间中某个成员引入   using std::cin
> 3.使用using namespace 命名空间名称引入  using namespace
> 在同一个项目中,通过构建不同的命名空间,就可以实现有同名函数的存在。并且这两个函数可以做到互不干扰。



在c语言中我们使用printf来完成输出操作,然后使用scanf来进行输出操作。 而在C++中我们通过流进行实现。就让Hellow,Word!来进入我们学习C++的第一弹

```c
#include <iostream> using namespace std; // std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中 int main() { 	
cout << "Hello,Word!" << endl;//endl相当于c语言中的\n 
}

二、C++的输入输出

在这里插入图片描述

注意:在使用cin cout时需要包含这个头文件,以及按命名空间的使用方法是std
<<是流插入运算符,>>是流提取运算符
cin 和cout可以自动识别变量的类型

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

在这里插入图片描述
C++也是兼容c语言的,所以也是可以使用scanf和printf来进行输入输出。

三、缺省参数

1.缺省参数的概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参。

void Func(int a = 0)
{
cout<<a<<endl;
}
int main()
{
Func(); // 没有传参时,使用参数的默认值
Func(10); // 传参时,使用指定的实参
return 0;
}

2.缺省参数分类

缺省参数分为全缺省和半缺省
全缺省

void Func(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
int main(){
	Func(, ,40)//缺省参数不能跳着来,会报错
	Func(10,20)
	return 0;
}

半缺省

#include <iostream>
using namespace std;
void Func(int a, int b = 10, int c = 20)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
int main() {
	Func(20);
	Func(5, 20);
	return 0;
}

在这里插入图片描述

注意:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现
//a.h
void Func(int a = 10);
// a.cpp
void Func(int a = 20)
{}
// 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值
  1. 缺省值必须是常量或者全局变量
  2. C语言不支持

四、函数重载

1.函数重载概念

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

#include<iostream>
using namespace std;
// 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 f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
int main()
{
Add(10, 20);
Add(10.1, 20.2);
f();
f(10);
f(10, 'a');
f('a', 10);
return 0;
}

C++支持函数重载的原理–函数名修饰
那么为什么C++支持函数重载,而C语言不支持函数重载呢?
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。
在C语言编译器编译后函数的名字不发生变化。
而在linux编译后函数的g++函数修饰后变成【_Z+函数长度+函数名+类型首字母】。例如int 类型就为 i char类型就为 c, 而int指针则为 Pi
在c++中的编译器后函数名较为难懂,就先看Linux中的。

通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
要注意一下如果两个函数的函数名和参数相同,返回值不同是不构成重载的。因为编译器无法区分。
函数重载是通过函数名来进行区分的

举例

void Swap(int a, int b) {
	//
}
void Swap(int x, int y) {
	//
}

像上面那样就不构成重载。只与形参类型有关而与形参名无关。

本篇内容到此结束,谢谢大家观看。

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

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

相关文章

VBA_MF系列技术资料1-415

MF系列VBA技术资料1-415 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-0…

一次性了解C语言中文件和文件操作

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 文件及文件操作 前言1. 文件分类1.1 文本文件1.2 二进制文件1.3 文本文件和二进制文件的区别 2…

Docker镜像逆向生成Dockerfile

你是否曾经遇到过一个想要使用的 Docker 镜像&#xff0c;但却无法修改以适应你的特定需求&#xff1f;或者你可能发现了一个喜欢的 Docker 镜像&#xff0c;但想要了解它是如何构建的&#xff1f;在这两种情况下&#xff0c;将 Docker 镜像逆向生成一个 Dockerfile 可以使用一…

基于jsp+mysql+Spring的SpringBoot招聘网站项目

基于jspmysqlSpring的SpringBoot招聘网站项目&#xff08;完整源码sql&#xff09;主要实现了管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀…

Science Robotics 逼真面部表情的机器人

人类可以产生数千种不同的面部表情来传达无数微妙的情绪状态&#xff0c;这种能力是人类社会互动中最有效和最有效的界面之一。在 2019 年冠状病毒病流行期间&#xff0c;口罩使社交互动变得尴尬&#xff0c;因为它们掩盖了面部表情。同时&#xff0c;当摄像机打开时&#xff0…

蓝桥杯单片机---第十届省赛题目解析

文章目录 比赛题目一、代码相关定义、声明1.头文件声明2.变量声明 二、主要函数1.main函数2.按键扫描3.数码管显示4.LED显示5.定时器中断 三、次要函数1.初始化函数Init2.按键函数Key3.LED函数Led4.数码管函数Seg5.iic函数中6.onewire函数中 总结 比赛题目 这里因为我没有这个题…

TouchGFX之图像

touchgfx提供的几种图像控件 1.Image&#xff08;图像&#xff09; TouchGFX中的图像会绘制关联图像文件中的像素数据。 使用图像文件前&#xff0c;必须将其导入到项目中。 图像大小是由关联的图像文件定义的&#xff0c;不能在运行时改动。 如果需要将图像显示为不同大小&…

C++链表(上)

【1】概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 (图片为转载&#xff09; 优点&#xff1a;链表的插入操作更快&#xff08; O(1) &#xff09;&#xff0c;无需预先分配内存空间 …

基于JSPM的美食推荐管理系统

背景 互联网的迅猛扩张彻底转变了全球各类组织的运营模式。自20世纪90年代起&#xff0c;中国各级政府和企事业单位便开始探索运用网络系统来处理管理事务。然而&#xff0c;早期的网络覆盖不广、用户接受度不高、相关网络法规不健全以及技术发展不成熟等因素&#xff0c;都曾…

蒙特卡诺法计算不规则图形的面积

结课大作业题目自拟&#xff1a; 利用蒙特卡诺法计算不规则图形的面积&#xff0c;由于题目自拟&#xff0c;所以选择用椭圆来表示待测面积的不规则图形。 代码实现&#xff1a; %%先绘制一个椭圆 a5;%长轴 b2;%短轴 f(x,y) x.^2/a^2 y.^2/b^2-1;%椭圆方程 fimplicit(f,Lin…

Golang线上内存爆掉问题排查(pprof)

Golang线上内存爆掉问题排查&#xff08;pprof&#xff09; 1 问题描述 某天&#xff0c;售后同事反馈&#xff0c;我们服务宕掉了&#xff0c;客户无法预览我们的图片了。 我们预览图片是读取存储在我们S3服务的数据&#xff0c;然后返回给前端页面展示。因为客户存在几百M的…

《HelloGitHub》第 96 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

在遭受攻击时如何有效监测服务器流量峰值——实战指南

引言 在网络安全领域&#xff0c;分布式拒绝服务攻击&#xff08;DDoS&#xff09;是一种常见的针对服务器及网络资源的恶意行为&#xff0c;它通过短时间内发送大量无效请求&#xff0c;导致服务器不堪重负而无法正常服务合法用户。当服务器遭受攻击时&#xff0c;快速识别并…

kubernetes(K8S)学习(五):K8S进阶(Lifecycle......偏理论)

K8S进阶&#xff08;Lifecycle......偏理论&#xff09; 一、Pod进阶学习之路1.1 Lifecycle1.2 重启策略1.3 静态Pod1.4 健康检查1.5 ConfigMap1.6 Secret1.7 指定Pod所运行的Node 二、Controller进阶学习之路2.1 Job & CronJob2.2 StatefulSet2.3 DaemonSet2.4 Horizontal…

拖拉拽做游戏?轻松打造个人掌机世界 | 开源日报 No.176

chrismaltby/gb-studio Stars: 7.8k License: MIT gb-studio 是一个快速、易于使用的拖放式复古游戏创建器&#xff0c;适用于您最喜爱的掌上游戏机系统。 该项目主要功能、关键特性和核心优势包括&#xff1a; 快速且易于使用使用 Electron 游戏构建应用程序和基于 C 的 GBD…

无尘布的多重应用:保持洁净,细致无遗

在现代社会中&#xff0c;随着科技的不断进步和人们对卫生环境要求的提高&#xff0c;无尘布作为一种多功能的擦拭材料&#xff0c;正被广泛应用于各种需要高洁净度环境的领域。其多重应用不仅为电子行业、医疗行业、生物工程和光学仪器等专业领域提供了便利&#xff0c;同时也…

在项目中缓存如何优化?SpringCache接口返回值的缓存【CachePut、CacheEvict、Cacheable】

SpringCache 介绍&#xff08;不同的缓存技术有不同的CacheManager&#xff09;注解入门程序环境准备数据库准备环境准备注入CacheManager引导类上加EnableCaching CachePut注解(缓存方法返回值)1). 在save方法上加注解CachePut2). 测试 CacheEvict注解&#xff08;清理指定缓存…

系统资源紧缺?不用担心,Linux命令和Shell脚本帮你搞定

在之前的文章中介绍了如何申请AWS免费主机使用WordPress搭建自己的个人网站&#xff0c;但是在我使用过程中发现了一个问题&#xff0c;由于陆陆续续安装了好几个插件&#xff0c;偶尔在访问网站时会出现数据库连接出错的异常情况&#xff0c;导致页面无法访问。稍等一会儿刷新…

想做跨境电商测评自养号需要满足什么条件?

测评对于卖家来说算是一种低成本&#xff0c;高回报的推广营销方式&#xff0c;对于商品流量&#xff0c;转化率&#xff0c;关键词质量分&#xff0c;链接权重等都起到了一定的辅助作用&#xff0c;但凡事都有好坏&#xff0c;倘若处理不得当&#xff0c;很容易影响店铺&#…

如何将Maven与TestNG集成

我们已经讨论了如何在maven中执行单元测试用例&#xff0c;但那些是JUnit测试用例&#xff0c;而不是TestNG。当maven使用“mvn test”命令进入测试阶段时&#xff0c;这些用例被执行。 本文将介绍如何将Maven与TestNG集成&#xff0c;并在maven进入测试阶段时执行TestNG测试。…