开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载)

之前浅显的讲解了数据结构的部分内容:数据结构专栏

那么今天我们迎来了新的起点:C++的探索之旅


文章目录

  • 1.命名空间
    • 1.1引入命名冲突
    • 1.2命名空间
      • 1.2.1命名空间的定义
      • 1.2.2命名空间的使用
  • 2.c++的输入与输出
  • 3.缺省参数
    • 3.1概念
    • 3.2缺省参数分类
  • 4.函数重载
    • 4.1概念
    • 4.2C++支持重载的原理----名字修饰


1.命名空间

1.1引入命名冲突

在c中:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//定义一个全局变量
int rand = 1;
 
int main()
{
    srand(time(0));
    printf("%d\n", rand);
    return 0;
}

严格的编译器会直接报错

请添加图片描述

rand我们都知道是产生随机数的函数,现在我定义了一个全局变量rand,显然是有命名冲突

所以c++就提供了解决方案

1.2命名空间

想必学过c的大家第一次接触c++看到:

using namespace std;

都会想这是什么??大多老师都会让说:你们先记着这是固定的,以后会懂(结果到了期末考完也什么都没说)

namespace 是 C++ 中的关键字用于创建命名空间,它是用来避免命名冲突并组织代码的一种机制。通过命名空间,可以将一系列的变量、函数、类等内容封装在其中,以便更好地组织代码

1.2.1命名空间的定义

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

  1. 命名空间的定义事例
namespace Test1
{
	// 命名空间中可以定义变量/函数/类型...
	int rand = 1;
	int Add(int left, int right)
	{
		return left + right;
	}

	struct ListNode
	{
		struct Node* next;
		int data;
	};
}
  1. 命名空间可以嵌套
namespace Test2
{
	int a = 0;
	namespace Test2_1
	{
		int a = 1;
	}
}
  1. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中(合并成一个)

一个工程中的test.h和上面test.cpp中两个N1会被合并成一个命名空间

一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

1.2.2命名空间的使用

双冒号 :: 在 C++ 中是作用域解析运算符,它用于指定特定范围内的命名空间或类的成员。它的主要作用有两个:

  1. 命名空间限定:用于指定特定命名空间中的变量、函数或类。例如,std::cout 中的 std 是命名空间,cout 是该命名空间下的对象。
  2. 类作用域限定:用于指定类的成员函数或静态成员变量。在类的定义或类外部,双冒号可以用于访问类的静态成员

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

  • 加命名空间名称及作用域限定符
namespace Test1
{
	// 命名空间中可以定义变量/函数/类型...
	int rand = 1;
	int Add(int left, int right)
	{
		return left + right;
	}
}

int main()
{
    // 使用作用域限定符号直接访问命名空间中的成员
	printf("%d\n", Test1::rand);
	return 0;
}

成功输出了:

请添加图片描述

  • 使用using将命名空间中某个成员引入
namespace Test2
{
	int b = 0;
	namespace Test2_1//这里命名空间嵌套
	{
		int a = 1;
	}
}
using Test2::b;
int main()
{
	printf("%d\n", b);
	printf("%d\n",Test2:: Test2_1::a);//这样访问a
	return 0;
}

请添加图片描述

  • 使用using namespace 命名空间名称引入

这就是我们经常看到的using namespace std;使用后使用std命名空间时就不需要加上std::,可以直接用了


2.c++的输入与输出

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
//(直接 using namespace std有点不安全)
using namespace std;
int main()
{
	int a = 0;
	cin >> a;
	cout << a << endl;
	cout << "Hello world!!!" << endl;
	return 0;
}

请添加图片描述

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间的使用方法使用std。
  2. coutcin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  3. <<流插入运算符,>>流提取运算符。(cout<<就是流入到控制台 )
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型
  5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识(挖个坑,以后详细介绍)

3.缺省参数

3.1概念

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

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

3.2缺省参数分类

  1. **全缺省参数(函数声明或定义中都指定默认值)
void Function2(int a = 1, int b = 2, int c = 3)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}
  1. 半缺省参数
void Function3(int a, int b = 2, int c = 3)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

注意:

  1. 半缺省参数必须从右往左依次来给出,不能间隔
  2. 缺省参数不能在函数声明和定义中同时出现,有函数声明一般选择函数声明
  3. 缺省值必须是常量或者全局变量

4.函数重载

学过Java的同学必然不陌生

4.1概念

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

  1. 函数参数类型不同
int Add(int a, int b)
{
	return a + b;
}
double Add(double a, double b)
{
	return a + b;
}
int main()
{
	cout<<Add(10, 20)<<endl;
	cout<<Add(10.1, 20.2);
	return 0;
}
  1. 函数参数个数不同
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
	cout << "f(int a)" << endl;
}
  1. 函数参数类型顺序不同(也可认为属于类型不同)
void f(int a, char b)//先int后char
{
	cout << "f(int a,char b)" << endl;
}
void f(char b, int a)//先char后int
{
	cout << "f(char b, int a)" << endl;
}

请添加图片描述

4.2C++支持重载的原理----名字修饰

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理编译汇编链接

请添加图片描述

链接器看到Test.o调用某个函数,但是没有函数的地址,就会到Func.o的符号表中找函数的地址,然后链接到一起。而使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则

c语言链接函数地址时(找函数)是靠函数名,所以不允许重名函数

c++中编译器需要为每个函数生成一个唯一的标识符来标记函数的地址。在 Linux 下,这些标识符是通过一种名为名字修饰(Name Mangling)的方式来生成的:

_Z + 函数名字符个数 + 函数名 + 每个参数类型首字母

所以重载函数虽然函数名相同,但是在链接函数地址时所依靠的标识符却不同

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

今天步入c++的学习啦,就先到这里!!!

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

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

相关文章

【深基9.例4】求第 k 小的数#洛谷(MLE)

题目描述 输入 n n n&#xff08; 1 ≤ n < 5000000 1 \le n < 5000000 1≤n<5000000 且 n n n 为奇数&#xff09;个数字 a i a_i ai​&#xff08; 1 ≤ a i < 10 9 1 \le a_i < {10}^9 1≤ai​<109&#xff09;&#xff0c;输出这些数字的第 k k k 小…

吉祥物如何解锁虚拟主持人身份,赋能品牌营销?

在互联网突破时空的整体语境下&#xff0c;一个吉祥物可以解锁虚拟主持人身份&#xff0c;结合动作捕捉技术&#xff0c;活跃于品牌线上线下营销活动场景&#xff0c;让吉祥物虚拟主持人凭借其“萌”、的特征&#xff0c;带给用户亲近感&#xff0c;快速拉近品牌与用户的距离&a…

基于Web的航空航天数字博物馆推荐系统

介绍 项目背景&#xff1a; 航空航天数字博物馆推荐系统是一个基于Web开发的应用&#xff0c;旨在为用户提供一个全面的航空航天领域的数字博物馆体验。通过展品展示、分类筛选和个性化推荐等功能&#xff0c;用户可以更好地了解航空航天知识和文化&#xff0c;并丰富参观体验…

关于git删除仓库中原本应该忽略的文件的研究

开门见山&#xff0c;先抛出一个结论&#xff1a; 任何被提交到远程仓库中的数据&#xff0c;都不能被彻底删除&#xff0c;只要提交上去了&#xff0c;就会永远留存。 任何被提交到远程仓库中的数据&#xff0c;都不能被彻底删除&#xff0c;只要提交上去了&#xff0c;就会…

centos7 arm服务器编译安装gcc 8.2

前言 当前电脑的gcc版本为4.8.5&#xff0c;但是在编译其他依赖包的时候&#xff0c;出现各种奇怪的问题&#xff0c;会莫名其妙的中断编译。本地文章讲解如何自编译安装gcc&#xff0c;替换系统自带的gcc。 环境准备 gcc 需要 8.2&#xff1a;下载地址 开始编译 1、解压gcc…

服务器 conda update 失败解决方法

1. 强制 conda update 租借一台服务器&#xff0c;发现 conda 版本是4.10.3&#xff0c;需要升级&#xff0c;使用了如下命令都没有效果&#xff0c;仍然是一样的版本 conda update conda update --all conda update -n base -c defaults conda最后强制用conda-forge通道更新…

基于Java SSM框架实现学生成绩管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现学生成绩管理系统演示 摘要 学生成绩是高校人才培养计划的重要组成部分&#xff0c;是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。而学生所在学院多采用半手工管理学生成绩的方式&#…

linux命令太多记不住吗?怎么办 ?于是推出了这样一套教程。

1.帮助命令 1.1 help命令 #语法格式&#xff1a; 命令 --help #作用: 查看某个命令的帮助信息 # 示例: # ls --help 查看ls命令的帮助信息# netstat --help 查看netstat命令的帮助信息1.2 man命令 #语法格式&#xff1a; man 命令 #作用: 查看某个命令的帮助手册 # 示例: …

Codeforces Round 918 (Div. 4)补题

Odd One Out&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;有三个数&#xff0c;其中两个相同&#xff0c;找出不同的那个数。 #include<bits/stdc.h> using namespace std; int main() {int t;scanf("%d",&t);while(t--){vect…

电脑安装 Python提示“api-ms-win-crt-process-l1-1-0.dll文件丢失,程序无法启动”,快速修复方法,完美解决

在windows 10系统安装完python后&#xff0c;启动的时候&#xff0c;Windows会弹出错误提示框“无法启动此程序&#xff0c;因为计算机中丢失了api-ms-win-crt-process-l1-1-0.dll&#xff0c;尝试重新安装该程序以解决此问题。” api-ms-win-crt-process-l1-1-0.dll是一个动态…

TEMU、亚马逊、shein平台崛起迅猛,掌握自养号测评必备运营攻略

2023年12月&#xff0c;SimilarWeb发布的数据显示&#xff0c;TEMU的独立访客数量达到4.67亿&#xff0c;与Aliexpress持平&#xff0c;全球排名第二。亚马逊以26.59亿用户位居第一&#xff0c;而SHEIN则拥有1.723亿用户&#xff0c;排名第三。 然而&#xff0c;仅仅六个月前的…

centos8部署MySQL5.7故障集

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 在centos8系统上安装MySQL&#xff0c;使用的是centos7上安装MySQL的脚本&#xff0c;出现了以下问题&#xff0c;以做记录&…

vue 组件 import make sure to provide the “name“ option.

百度了好多结果&#xff0c;都过时了&#xff0c;例如&#xff1a; 模块引入是否加{} 再比如&#xff1a; 对于递归组件&#xff0c;请确保提供“name”选项。 出现该错误情况之一&#xff1a; 错误由未正确引入组件或子组件引起&#xff0c;如element-ui中form表单组件未引…

simulink之Fixed-Point Numbers

Fixed-Point Numbers 定点数及其数据类型的特征在于它们的字大小&#xff08;以位为单位&#xff09;、二进制点以及它们是有符号的还是无符号的。定点设计器™ 软件支持整数和定点数。这些数据类型之间的主要区别在于它们的二进制点。 注意&#xff1a;定点数字的字大小最多…

redis原理(二)数据结构

redis可以存储键与5种不同数据结构类型之间的映射&#xff1a; String类型的底层实现只有一种数据结构&#xff0c;也就是动态字符串。而List、Hash、Set、ZSet都由两种底层数据结构实现。通常我们把这四种类型称为集合类型&#xff0c;它们的特点是一个键对应了一个集合的数据…

类脑研究之脑组成及神经系统相关理论!大脑是什么?大脑和脑有什么区别?大脑皮层和脑膜什么关系?人的神经系统有哪些?

目录 1 引言2 神经系统3 脑组成3.1 大脑成分3.2 大脑外部&#xff1a;脑膜3.3 大脑中部&#xff1a;大脑皮层3.4 大脑内部3.5 脑干3.6 小脑 1 引言 为了深入研究类脑&#xff0c;必须了解大脑的结构和机制。从神经系统分级和脑组成两个角度出发&#xff0c;详细介绍了大脑的生…

CLion中想要在一个项目中有多个C源文件(有多个main函数)

我们知道&#xff0c;一个项目中只能有一个main()函数&#xff0c;但是我们不想分开创建这么多个C源文件&#xff0c;我们想要在一个工程中允许存在多个main方法了&#xff0c;而且可以独立运行&#xff0c;那么只需要以下步骤即可&#xff1a; 1&#xff09;在 File - Settin…

芯课堂 | 华芯微特MCU在PCB板级设计中对ISP引脚的应用

1.应用描述 ISP&#xff08;In System Programming&#xff09;&#xff0c;在系统编程&#xff0c;使用片内驻留出厂引导程序&#xff08;BootROM&#xff09;配合UART / SPI等外设进行烧录。 华芯微特全系MCU的ISP操作说明&#xff1a;当芯片上电后检测到 ISP 引脚持续 5ms…

MeshLab生成分形地形

文章目录 分型地形脊状多重分形其他地形 分型地形 分形地形是一种较为复杂的几何对象&#xff0c;MeshLab提供了下列五种地形生成算法&#xff0c;并且贴心地给出了每种算法相对较好的参数。 算法SeedOctaves缺项性分形增量偏移增益fBM(fractal Brownian Motion)11021.2--Sta…