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

前言:本文章主要介绍一些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.mzph.cn/diannao/21905.shtml

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

相关文章

带大家做一个,易上手的家常猪肉炖白菜

今天 带大家做一个 猪肉炖白菜 一块猪肉 切片 一块生姜 两边

doris实战处理(一)doris表的建表规范、查询

感谢原文&#xff1a;https://mp.weixin.qq.com/s/tGbdkF62WU6qbAH0mqtXuA 第一部分&#xff1a;字符集规范 【强制】数据库字符集指定utf-8&#xff0c;并且只支持utf-8。 命令规范 【建议】库名统一使用小写方式&#xff0c;中间用下划线&#xff08;_&#xff09;分割&a…

外星人Alienware x17R1 原厂Windows11系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

ProxySQL + MySQL MGR 实现读写分离实战

文章目录 前言1、ProxySQL 介绍1.1、ProxySQL 如何工作1.2、ProxySQL 工作原理 2、ProxySQL 安装与读写分离实战2.1、ProxySQL 安装2.2、读写分离配置2.3、读写分离实战2.4、SpringBoot 整合 前言 该文章实践之前&#xff0c;需要搭建MySQL MGR集群&#xff0c;关于 MySQL MGR…

太速科技-基于XC7V690T的12路光纤PCIe接口卡

基于XC7V690T的12路光纤PCIe接口卡 一、板卡概述 基于XC7V690T的12路光纤PCI-E接口卡&#xff0c;用于实现多通道高速光纤数据接收和发送&#xff0c;板卡兼容PCIe 2.0和PCIe 3.0规范&#xff0c;利用PCI-E Switch PEX 8748实现FPGA芯片与计算机的通信&#xff0c;计算机与板…

[MYSQL]合作过至少三次的演员和导演

ActorDirector 表&#xff1a; ---------------------- | Column Name | Type | ---------------------- | actor_id | int | | director_id | int | | timestamp | int | ---------------------- timestamp 是这张表的主键(具有唯一值的列).编写解决方案…

国外客户如何筛选供应商?

国外买家每天会收到许多供应商的开发信。他们是如何在众多的供应商中筛选出最合适的一个呢&#xff1f; 作为我们自己&#xff0c;熟知和掌握国外买家筛选供应商的方法&#xff0c;能让我们更加接近国外买家的要求&#xff0c;从而突围而出。 国外买家搜索供应商的方法 和外…

【前端】政务服务大数据可视化监控平台(源码+html+css+js)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

时序预测 | Matlab灰色-马尔科夫预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab灰色-马尔科夫预测 灰色马尔科夫预测&#xff08;Grey-Markov Prediction&#xff09;是一种用于时间序列预测的方法&#xff0c;它结合了灰色系统理论和马尔科夫链模型。灰色系统理论是一种非参数化的预测方法…

Spring Boot 整合开源 Tess4J库 实现OCR图片文字识别

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

图片去手写软件有哪些?这三款值得一试!

图片去手写软件有哪些&#xff1f;在当今数字化时代&#xff0c;图片处理与编辑已成为我们日常生活中不可或缺的一部分。特别是在处理手写笔记、涂鸦或草图时&#xff0c;图片去手写软件发挥着至关重要的作用。它们能够帮助我们轻松去除图片中的手写内容&#xff0c;使图片更加…

高中数学:解三角形-大题练习

例题1 解析 第一小问 根据条件等式&#xff0c;我们发现&#xff0c;每一项都含有边&#xff0c;但是&#xff0c;不是每一项都含有角 于是&#xff0c;我们要想到用正弦定理把边换为角来解答该题 第二小问 例题2 解析 第一小问 两个等式条件&#xff0c;各个项都含有边&…

工业相机识别电路板元器件:彩色与黑白的区别

工业相机用于识别电路板上的元器件时&#xff0c;选择彩色相机或黑白相机取决于具体应用需求和条件。彩色相机能提供更丰富的信息&#xff0c;但处理复杂度较高&#xff1b;黑白相机则在处理速度和精度上具有优势。理解它们的区别和各自的优缺点&#xff0c;有助于在具体项目中…

C语言| 输出菱形*(梳理篇II)

C语言| 输出菱形*-CSDN博客 凡事还是得自己独立思考后&#xff0c;写一遍程序才能发现问题所在。 容易犯的错误&#xff1a; 【完整程序注释】 运行结果 /* 输出菱形 1 总行数 n为奇数&#xff0c;分上三角形下三角形&#xff0c;只考虑左边的空格和星号* 2 上三角形 行数…

k8s怎么监听资源的变更

监听k8s所有的 Deployment 资源 package mainimport ("context""fmt"v1 "k8s.io/api/apps/v1""k8s.io/apimachinery/pkg/util/json""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/cli…

本人自己Python安装和配置无套路分享

初学者是不是经常被python的各种问题困扰&#xff0c;教你轻松配置好这一切 如果你已经安装了python可以直接跳到你需要的内容 安装python 如果你是Linux系统可以直接使用包管理器安装包(对于linux系统管理员应该是轻车熟路了) Debian/Ubuntu系统: sudo apt update sudo ap…

【GD32】06 - SPI (含ST7735S TFT-LCD屏幕驱动)

这篇文章我们看看GD32中如何实现SPI&#xff0c;软件SPI的话可以参考我之前的文章&#xff0c;把对应操作GPIO口的代码从STM32改成GD32就可以使用了。 【快速上手STM32】SPI通信协议&&1.8寸TFT-LCD&#xff08;ST7735S&#xff09;_tftlcdst7735和stm32-CSDN博客文章浏…

攻防世界maze做法(迷宫题)

首先查壳64bit&#xff0c;直接丢进ida64中进行反编译就完事儿了&#xff0c;然后直接进入main函数打注释分析首先&#xff0c;题目已经提示了这是个迷宫题&#xff0c;我们抓住做迷宫题的两个要点&#xff0c;一找玩法&#xff0c;二找地图&#xff0c; 玩法在主函数中&#…

Linux防火墙入门——iptables、firewalld配置详解

合理的防火墙是你的计算机防止网络入侵的第一道屏障。你在家里上网&#xff0c;通常互联网服务提供会在路由中搭建一层防火墙。当你离开家时&#xff0c;那么你计算机上的那层防火墙就是仅有的一层&#xff0c;所以配置和控制好你 Linux 电脑上的防火墙很重要。 很多 Linux 发…

微信视频号上是怎么开店铺的?从入驻到发货,具体流程来了!

这两年&#xff0c;视频号逐渐走入大家视野 单价高&#xff0c;商家又少&#xff0c;很多类目都属于空白无商家入驻阶段&#xff0c;于是好多商家&#xff0c;都准备去视频号小店这个新“黑马”发展发展 那视频号是怎么开店卖东西的&#xff1f;今天我就来给大家分享一下&…