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

这篇具有很好参考价值的文章主要介绍了开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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



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;
}

严格的编译器会直接报错

开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载),c++学习,c++,java,开发语言,算法,opencv,机器学习,linux

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;
}

成功输出了:

开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载),c++学习,c++,java,开发语言,算法,opencv,机器学习,linux

  • 使用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;
}

开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载),c++学习,c++,java,开发语言,算法,opencv,机器学习,linux

  • 使用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;
}

开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载),c++学习,c++,java,开发语言,算法,opencv,机器学习,linux

  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;
}

开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载),c++学习,c++,java,开发语言,算法,opencv,机器学习,linux

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

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

开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载),c++学习,c++,java,开发语言,算法,opencv,机器学习,linux

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

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

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

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

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

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

今天步入c++的学习啦,就先到这里!!!文章来源地址https://www.toymoban.com/news/detail-790137.html

到了这里,关于开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++:命名空间,缺省参数,函数重载,引用,内联函数

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》 本篇博客作为C++知识总结,我们来认识命名空间,缺省参数,函数重载,引用,内联函数。 那么在介绍命名空间时,我们先用C++的方式打印\\\"hello world\\\"。 其中,using namespace std; 就是一种命名空间的使用。 在

    2024年02月11日
    浏览(22)
  • C++入门 上(命名空间 缺省参数 函数重载)

    在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace的出现就是针对这种问题的。 定义命名空间

    2024年02月19日
    浏览(25)
  • 【C++】关键字 & 命名空间 & 输入输出 & 缺省函数

    C++  总计 63 个, C语言 32 个 直接上图:  asm do if return try continue auto double inline short typedef for bool dynamic_cast int signed typeid public break else long sizeof typename throw case enum mutable static union wchar_t catch explicit namespace static_cast unsigned default char export new struct using friend class ext

    2024年02月08日
    浏览(21)
  • C++基础知识 (命名空间、输入输出、函数的缺省参数、函数重载)

    🌠 例1: #include iostream 标准输入输出 std 是 c++ 标准库的命名空间,将标准库的定义实现都放到这个命名空间中 using namespace std 展开 std 里的内容 cout   c 代表的是 console 控制台的意思, out 有输出的意思 流运算符 流插入 endl 等价于 \\\'n\\\' 在 c++ 中,变量、函数和类的名称存在于

    2024年02月15日
    浏览(20)
  • [C++] C++入门第一篇 -- 命名空间,输入输出,缺省函数,函数重载底层原理

      目录 1、  2、命名空间 2.1 命名空间的定义 2.2 命名空间的使用方式 2.2.1 加命名空间名称及作用域限定符 2.2.2 使用using将命名空间中某个成员引入 2.2.3 使用using namespace 命名空间名称引入 3、C++输入与输出 4、缺省参数 4.1 缺省参数的概念 4.2 缺省参数分类 4.2.1 全缺省参

    2024年02月15日
    浏览(30)
  • 【C++初阶】关键字&命名空间&缺省函数&函数重载入门必看!!!超详解!!!

     ========================================================================= 主页点击直达: 个人主页 我的小仓库:代码仓库 C语言偷着笑: C语言专栏 数据结构挨打小记: 初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记: LeetCode刷题 算法: 算法专栏  C++头疼记: C++专栏 计算机

    2024年02月07日
    浏览(27)
  • 【C++那些事儿】初识C++ 命名空间,C++中的输入输出以及缺省函数

    君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,数据结构和算法初阶更新完毕,我们继续来扩充我们的知识面,今天我们从认识C++开始来带大家学习C++,我之前看过一套书叫做《明朝那些事儿》,把本来枯燥的历史讲的生动

    2024年02月08日
    浏览(31)
  • 【C++深入浅出】初识C++上篇(关键字,命名空间,输入输出,缺省参数,函数重载)

         目录 一. 前言 二. 什么是C++ 三. C++初探 四. 命名空间 4.1 为什么要引入命名空间 4.2 命名空间的定义 4.3 命名空间使用 五. C++的输入输出 六. 缺省参数 6.1 缺省参数的概念 6.2 缺省参数的分类 七. 函数重载  7.1 函数重载的概念 7.2 函数重载的条件 7.3 C++支持函数重载

    2024年02月13日
    浏览(26)
  • 【C++初阶】C++基础(上)——C++关键字、命名空间、C++输入&输出、缺省参数、函数重载

    目录 1. C++ 2. 命名空间 2.1 命名空间的定义 2.2 命名空间的使用 3. C++输入输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C++支持函数重载的原理——名字修饰(name Mingling) 5.3 extern \\\"C\\\" ❀❀❀ 没有坚持的努力,本质上并没有多

    2024年02月15日
    浏览(27)
  • 【C++初阶】一、入门知识讲解(C++关键字、命名空间、C++输入&输出、缺省参数、函数重载)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】十一、归并排序(比较排序)的讲解和实现 (递归版本 + 非递归版本 -- C语言实

    2024年02月05日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包