【C++】入门基础(命名空间、缺省参数、函数重载)

目录

一.命名空间:namespace

1.namespace的价值

2.namespace的定义

3.namespace的使用方法

3.1 域解析运算符::

3.2 using展开

3.3 using+域解析运算符

二.输入输出

三.缺省参数

四.函数重载

1.参数类型不同

2.参数个数不同

3.参数顺序不同


一.命名空间:namespace

1.namespace的价值

在C/C++中,存在大量变量、函数,它们的名称都存在在全局作用域中,可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化,避免命名的冲突。

2.namespace的定义

使用namespace关键字定义一个域,这个域跟全局域各自独立,不同的域中可以定义相同名字的变量,这就避免的命名的冲突。其中C++标准库都放在一个叫std(standard)的命名空间中。例如以下代码:同一个名的变量rand在不同域中表现不同的内容

TIPs:cout<<  <<endl相当于C语言中的printf(" \n");

#include<iostream>
#include<stdlib.h>
using namespace std;namespace zyh
{int rand = 10;
}int main()
{//默认是std::rand//标准库中rand是一个地址cout << rand << endl;//命名空间zyh中rand是一个Int变量cout << zyh::rand << endl;return 0;
}

 ​​​​

C++中域有局部域,全局域,命名空间域,类域;局部域、全局域会影响编译查找逻辑和变量的生命周期,但命名空间域和类域不会影响变量的生命周期。

namespce只能定义在全局中,并且支持嵌套定义。项目工程文件中多文件中定义的同名namespace会被认为是一个namespace,自动合并到一起。

//嵌套定义
namespace zyh
{int rand = 10;namespace zyh2{int rand = 20;}
}

3.namespace的使用方法

3.1 域解析运算符::

在变量名前加上(命名空间名) + :: (域解析运算符)就可以访问指定命名空间域中的变量了,例如:

namespace zyh
{int a = 10;int b = 20;
}int main()
{//访问命名空间域zyh中的a和bcout<<zyh::a<<endl;cout<<zyh::b<<endl;return 0;
}

3.2 using展开

using + (命名空间名);直接将命名空间内的所有成员全部展开,也就是说展开后无需加域解析运算符就可访问,但这种方式风险极大,不推荐在项目中使用,例如:

namespace zyh
{int a = 10;int b = 20;
}//直接使用using展开命名空间zyh
using namespce zyh;
int main()
{/展开后就能直接访问命名空间域zyh中的a和bcout<<a<<endl;cout<<b<<endl;return 0;
}

3.3 using+域解析运算符

这就是前两者的结合版,将命名空间域中的某个成员进行展开使用,这种方式是比较合理的,也经常使用到,例如cout和endl是std命名空间中的输出和换行,由于经常要用到,因此可以在程序最开头直接将这两个成员进行展开,此后方便使用。

using std::cout;
using std::endl;int main()
{int a = 10;cout<<a<<endl;
}

二.输入输出

C++的输入输出相较于C语言就舒服多了,C++不需要自己手动输入格式,它能自动识别变量的类型(本质是通过函数重载实现的)并进行输入输出。

  1. <iostream>是input,output stream的缩写,是标准输入、输出流库,定义了标准的输入、输出对象
  2. std::cin相当于scanf,配合流插入运算符>>,实现数据的输入
  3. std::cout相当于printf,配合流输出运算符<<,实现数据的输出
  4. std:endl相当于换行(此时可以这么理解)
using std::cout;
using std::endl;
using std::cin;
int main()
{int a;double b;char c;//不同类型的abc,cin和cout都能自动识别处理cin >> a;cin >> b;cin >> c;cout << a << "/" << b << "/" << c << endl;return 0;
}

三.缺省参数

有些地方缺省参数也叫做默认参数,它是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定的实参,则采用该形参的缺省值,否则就使用指定的实参。

全缺省就是全部形参都给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。原因很好理解,就是为了防止歧义,例如4个参数中只有第一个和最后一个有缺省值,那么若给的实参有3个,应该如何分配?为了应对这些情况,C++特意做出的规定。

函数声明和定义分离的时候,缺省参数不能在函数声明和定义中同时出现,否则就会出现歧义,规定必须函数声明给缺省值。

//全缺省
void func1(int a = 10, int b = 20, int c = 30)
{cout << a << "/" << b << "/" << c << endl;
}//半缺省
void func2(int a, int b = 0, int c = 0)
{cout << a << "/" << b << "/" << c << endl;
}int main()
{func1();func1(666);func1(1, 2, 3);func2(6);func2(6, 7, 8);return 0;
}

四.函数重载

C++支持在同一作用域下出现相同的函数名,区别在于这些同名函数的形参不同,这个不同,可以是参数个数,参数类型,或参数顺序。C语言是不支持同一作用域中出现同名函数的,这一改动就是为了方便使用,更加灵活。

1.参数类型不同

int Add(int a, int b)
{return a + b;
}double Add(double a, double b)
{return a + b;
}int main()
{cout << Add(3, 4) << endl;cout << Add(1.1, 2.2) << endl;return 0;
}

2.参数个数不同

int Add(int a, int b)
{return a + b;
}int Add(int a, int b, int c)
{return a + b + c;
}

3.参数顺序不同

实际上也就是参数类型不同

void f(int a, double b)
{cout << "f1" << endl;
}void f(double b, int a)
{cout << "f2" << endl;
}int main()
{f(1, 1.2);f(2.2, 4);return 0;
}

注意:返回值不能最为函数重载的条件,因为调用函数的时候无法区分,因此只能将参数的区别作为函数重载的依据 

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

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

相关文章

APP专项测试之网络测试

背景 当前app网络环境比较复杂&#xff0c;越来越多的公共wifi&#xff0c;网络制式有2G、3G、4G网络&#xff0c;会对用户使用app造成一定影响&#xff1b;当前app使用场景多变&#xff0c;如进地铁、上公交、进电梯等&#xff0c;使得弱网测试显得尤为重要&#xff1b; 网络正…

链路追踪系列-02.演示zipkin

当本机启动docker es zipkinServer之后&#xff1a; 启动3个项目&#xff1a;先eureka-server&#xff0c;再 PaymentMain8001,… 浏览器打开&#xff1a;http://localhost:9001/consumer/payment/zipkin consumer代码 &#xff1a; provider: 此时查询es:

uboot如何选择启动设备

cpu选择启动设备有两种方式 1、通过bootpin选择某个设备 比如从SD卡启动、EMMC、USB启动。 2、通过bootpin选择某个顺序 比如&#xff1a; SD、SPI、NANDSPI、NAND、SD

3-2 多层感知机的从零开始实现

import torch from torch import nn from d2l import torch as d2lbatch_size 256 # 批量大小为256 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) # load进来训练集和测试集初始化模型参数 回想一下&#xff0c;Fashion-MNIST中的每个图像由 28 28 784…

学习C++,应该循序渐进的看哪些书?

学习C是一个循序渐进的过程&#xff0c;需要根据自己的基础和目标来选择合适的书籍。以下是一个推荐的学习路径&#xff0c;包含了从入门到进阶的书籍&#xff1a; 1. 入门阶段 《C Primer Plus 第6版 中文版》 推荐理由&#xff1a;这本书同样适合C零基础的学习者&#xff0…

python运行环境在新旧电脑间迁移

目录 方法1. 直接复制虚拟环境文件夹&#xff1a;方法2. 导出和导入依赖项&#xff1a;方法3. 用 Docker 镜像&#xff1a; 当您需要在不同电脑之间迁移 Python 运行环境时&#xff0c;可以采用以下方法之一&#xff1a; 方法1. 直接复制虚拟环境文件夹&#xff1a; 将整个虚…

[CISCN2018]2ex

啊!好恶心的mips寄存器 好多IDA都查不到,这寄存器~! fuck! 但是这种寄存器一般的题都不难 这道题就是 我用平常的方法,没找到 左边函数一个一个点 看见这里0X3F base64 密文呢? 我giao 外面的txt文件里面 脚本 import base64 import string# 定义你的自定义字符集 st…

PHP语言教程与实战案例

PHP是一种广泛使用的开源脚本语言&#xff0c;尤其适用于Web开发并可嵌入HTML中。它的语法吸收了C语言、Java和Perl的特点&#xff0c;易于学习&#xff0c;功能强大。本文将带领你从基础语法入手&#xff0c;通过一系列实用案例&#xff0c;逐步掌握PHP的核心概念和技巧。 项…

使用JDBC实现事务管理与隔离级别设置

使用JDBC实现事务管理与隔离级别设置 在Java开发中&#xff0c;JDBC&#xff08;Java Database Connectivity&#xff09;是常用的数据库连接方式。在处理数据库操作时&#xff0c;事务管理和隔离级别设置是保证数据一致性和可靠性的关键。本篇博客将通过示例代码&#xff0c;…

并发编程-11线程池详解

一 线程池基础和使用 1.1 什么是线程池 “线程池”&#xff0c;顾名思义就是一个线程缓存&#xff0c;线程是稀缺资源&#xff0c;如果被无限制的创建&#xff0c;不仅会消耗系统资源&#xff0c;还会降低系统的稳定性&#xff0c;因此Java中提供线程池对线程进行统一分配、调优…

聊点基础---Java和.NET开发技术异同全方位分析

1. C#语言基础 1.1 C#语法概览 欢迎来到C#的世界&#xff01;对于刚从Java转过来的开发者来说&#xff0c;你会发现C#和Java有很多相似之处&#xff0c;但C#也有其独特的魅力和强大之处。让我们一起来探索C#的基本语法&#xff0c;并比较一下与Java的异同。 程序结构 C#程序…

美团收银Android一面凉经(2024)

美团收银Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《美团收银Android一面凉经(2024)》。 应聘岗位: 美团餐饮PaaS平台Android开发工程师…

pnpm 如何安装指定版本

要安装特定版本的pnpm&#xff0c;可以使用npm命令来全局安装特定版本的pnpm&#xff0c;例如&#xff1a; npm install -g pnpm2.0.0在上面的命令中&#xff0c;使用了2.0.0来指定安装2.0.0版本的pnpm。您可以将2.0.0替换为您需要安装的版本号。 如果您使用的是yarn&#xf…

【2-1:RPC设计】

RPC 1. 基础1.1 定义&特点1.2 具体实现框架1.3 应用场景2. RPC的关键技术点&一次调用rpc流程2.1 RPC流程流程两个网络模块如何连接的呢?其它特性RPC优势2.2 序列化技术序列化方式PRC如何选择序列化框架考虑因素2.3 应用层的通信协议-http2.3.1 基础概念大多数RPC大多自…

【C++ | 虚函数】虚函数详解 及 例子代码演示(包含虚函数使用、动态绑定、虚函数表、虚表指针)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Matlab-Simulink模型保存为图片的方法

有好多种办法将模型保存为图片&#xff0c;这里直接说经常用的 而且贴到Word文档中清晰、操作简单。 simulink自带有截图功能&#xff0c;这两种方法都可以保存模型图片。选择后直接就复制到截切板上了。直接去文档中粘贴就完事了。 这两个格式效果不太一样&#xff0c;第一种清…

JS登录页源码 —— 可一键复制抱走

前期回顾 https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501 登录页预览效果 <!DOCTYPE html> <html lang"en"><head…

使用Spring Boot实现分布式锁

使用Spring Boot实现分布式锁 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 什么是分布式锁&#xff1f; 分布式系统中&#xff0c;由于多个节点并行处理任务&#xff0c;为了保证数据的一致性…

[crypt]-异或-异性相吸

压缩包两个文件&#xff0c;一个key&#xff0c;一个密文。 打开密文是乱码&#xff0c;使用16进制查看&#xff0c;一串数字&#xff0c;和key转换为bytes逐位异或。得到flag 开始以为是键盘密码&#xff0c;qeasdf,左上角区域 #异性相吸 xor keyasadsasdasdasdasdasdasdas…

通信协议 | 一文玩转UART协议就够了

文章目录 协议基础1、UART简介2、UART特性3、UART协议帧3.1、起始位3.2、数据位3.3、奇偶校验位3.4、停止位 4、UART通信步骤 最详细的UART通讯协议分析Verilog代码实现UART接口模块驱动 协议基础 1、UART简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&…