命名空间,缺省参数和函数重载

2024-06-04 12:36

本文主要是介绍命名空间,缺省参数和函数重载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:本文章主要介绍一些C++中的小语法。

目录

命名空间

namespace的使用

访问全局变量

namespace可以嵌套

 不同文件中定义的同名的命名空间可以合并进一个命名空间,并且其中不可以有同名的变量

C++中的输入和输出

缺省参数(默认参数)

缺省参数又分为全缺省和部分缺省

既有声明又有定义的情况下

函数重载

不同作用域下的函数可以同名

调用歧义问题:

为什么C不支持函数重载,C++支持?


命名空间

为什么要有命名空间?

命名空间是解决C语言中命名重复的问题

比如,以下代码(在c++环境下运行)的情况:

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

在C语言中rand是一个函数名,而在该代码中定义了一个与rand函数名重名的变量。

#include <stdio.h>
int rand = 0;
int main()
{int rand = 1;printf("%d", rand);
}

以上代码的打印结果是:

 

为什么是1呢?

在C语言中局部优先,所以打印的是main函数中rand的值。

为什么没有报变量重定义的错呢?

因为rand这个变量是在不同的域中定义的,一个定义在局部域中,另一个定义在全局域中,所以没有命名重复。


 

namespace的使用

开辟一个命名空间域,可以在里面定义变量,函数,结构体等。与其他域中定义的一样的名字的变量不构成重名。

#include <stdio.h>namespace _name
{int rand = 0;
}int rand = 1;int main()
{int rand = 2;printf("%d", rand);
}

 下面代码的运行结果是:

另一份代码:

#include <stdio.h>namespace _name
{int rand = 0;
}//int rand = 1;int main()
{//int rand = 2;printf("%d", rand);
}

上面的代码会报错:rand未定义 

 

为什么呢?

编辑器的默认查找规则:

1.先去局部域中去找

2.去全局域中去找

3.但不去命名空间域中去查找。

那么如何使用命名空间中定义的变量,结构体,函数等呢?

:: 两个冒号是域作用限定符

1.全展开命名空间

#include <stdio.h>namespace _name
{int rand = 0;
}
using namespace _name;//展开命名空间//int rand = 1;int main()
{//int rand = 2;printf("%d", rand);
}

建议:在大型项目中不建议直接全展开,在平时刷题时写代码时随便用。

展开命名空间的本质:影响查找规则:

1.先去局部域中去找

2.去全局域中去找

3.但不去命名空间域中去查找。

 

2.指定访问

#include <stdio.h>namespace _name
{int rand = 0;
}
//using namespace _name;//int rand = 1;int main()
{//int rand = 2;//指定访问printf("%d", _name::rand);
}

3.指定某一个展开

#include <stdio.h>namespace _name
{int rand = 0;
}
//using namespace _name;
using _name::rand;//指定某一个展开//int rand = 1;int main()
{//int rand = 2;//printf("%d", _name::rand);printf("%d", rand);
}

访问全局变量

#include <stdio.h>namespace _name
{int rand = 0;
}
//using namespace _name;
using _name::rand;int rand = 1;int main()
{//int rand = 2;//printf("%d", _name::rand);printf("%d", ::rand);//访问全局域中的rand
}

namespace可以嵌套

namespace _name
{int rand = 0;namespace bit{int rand = 1;}
}

 不同文件中定义的同名的命名空间可以合并进一个命名空间,并且其中不可以有同名的变量

//test.h
namespace _name
{int rand1 = 1;
}
//test.c
#include <stdio.h>
#include "test.h"
namespace _name
{int rand = 0;
}using namespace _name;int main()
{printf("%d", rand1);return 0;
}

C++中的输入和输出

#include <iostream>
using namespace std;int main()
{int i;cin >> i;//相当于scanf("%d",&i);cout << i << endl;//相当于printf("%d",i);cout << "hello world" << endl;//相当于printf("hello world\n");
}

运行结果: 

代码解析:

#include<iostream>: io流,里面有定义的命名空间std

using namespace std:展开std这个命名空间,该空间中有定义的cin和cout

cout:console output 控制台输出

<<:流插入

cin: console input 控制台输入

>>: 流提取

endl:相当于“\n”,也就是换行

cin<< 可以自动识别数据的类型,相较于scanf更方便一些。


缺省参数(默认参数)

函数的全部参数或部分参数有默认值,并且调用时,可以不为有默认值的参数传参。

void f(int a = 1)//形参a有默认值,为1
{cout << a << endl;
}

以下有两份代码:

#include <iostream>
using namespace std;void f(int a = 1)
{cout << a << endl;
}int main()
{f();//不传值,那么调用时形参a为默认值1return 0;
}

#include <iostream>
using namespace std;void f(int a = 1)
{cout << a << endl;
}int main()
{f(2);//传值return 0;
}

 

缺省参数又分为全缺省和部分缺省

全缺省就是:全部的形参都有默认值

部分缺省: 形参从右向左顺序缺省,不能出现跳跃,所以传值的时候也不能跳跃传值

//全缺省
void f(int a = 0, int b = 1, int c = 2)
{//....
}//部分缺省
void f(int a, int b = 1, int c = 2)
{//....
}//错误示范,不是从右向左顺序缺省
void f(int a = 0, int b, int c = 2)
{//....
}

既有声明又有定义的情况下

只在定义中给形参加默认参数

//既有声明又有定义
void f(int a = 0, int b = 1, int c = 2);
void f(int a, int b, int c )
{//....
}

函数重载

函数重载的条件:同一作用域,函数名相同,形参列表不同(形参的类型不同,类型的数量不同,类型的顺序不同)

//都在全局域中定义,下面的函数参数列表都与第一个比较
void f(int a,char b)
{cout << "heihei" << endl;
}//类型顺序不同
void f(char b, int a)
{cout << "haha" << endl;
}
//数量不同
void f(int a, char b,int c)
{cout << "wuwu" << endl;
}
//类型不同
void f(double a, char b)
{cout << "lalala" << endl;
}

不同作用域下的函数可以同名

namespace tmp
{void f()//在命名空间域中定义的f函数{cout << "hello world" << endl;}}void f()//在全局域中定义的f函数
{cout << "heihei" << endl;
}

因为两个函数的作用域不同,就算将命名空间展开两个f函数仍不构成重载。

调用歧义问题:

void f(int a = 10)
{}
void f()
{}
int main()
{f();return 0;
}

 即使函数重载了,也可能出现函数调用不明确的问题。

为什么C不支持函数重载,C++支持?

C中是不支持函数重载的,C++支持函数重载,

函数的地址:就是函数中有一堆需要执行的指令,而函数的地址就是需要执行的第一条指令的地址。

原因:链接时,

C是直接用函数名找函数的地址

C++是用修饰后的函数名找函数的地址 

结语:希望这篇文章能够让你有所收获。

这篇关于命名空间,缺省参数和函数重载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客