初识C++【命名空间】【输入输出】【缺省参数】【函数重载】

前言

C++是一种通用的编程语言,被广泛用于开发各种应用程序,包括系统软件、游戏、手机应用和高性能计算等。它是C语言的扩展,添加了许多新特性和功能,并支持面向对象编程。C++可以在不同的平台上编译和运行,具有高效性、可移植性和灵活性等特点。它的语法和语义与C语言相似,但还包括了类、模板、异常处理和STL(标准模板库)等特性。C++是一种强大而灵活的编程语言。简单的说,C++就是C语言的plus版本,C++的出现就是建立在C语言之上的。

一.命名空间

命名空间(Namespace)是一种组织和管理代码的方式,它将代码分组并提供了唯一的标识符(名称)来引用这些代码。它的主要作用是避免命名冲突,让不同模块或代码库中的同名元素能够被准确地引用。举个例子:

#include<stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{// 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”printf("%d\n", rand);return 0;
}

如果我把这个代码放到编译器里编译就会出现报错,说的是我们的rand重定义了。那是因为在头文件stdlib里我们有rand这个函数。这就是命名冲突了。

1.1namespace的价值

在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化,以避免命名冲突或名字污染,这时在我们的C++里面就引入了一个叫namespace的东西,在东西就可以很好的解决掉命名冲突的问题。

1.2namespace的定义

1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员(值得注意的是在{}后面不加;)。命名空间中可以定义变量/函数/类型等。
就像是这样:
#include<stdio.h>
#include <stdlib.h>
namespace lwz
{//在命名空间里可以是变量、函数和类型int rand = 10;int Add(int a, int b){return a + b;}struct LNode{int* a;struct LNode* next;};
}
int main()
{// 这里默认是访问的是全局的rand函数指针printf("%p\n", rand);// 这里指定lwz命名空间中的randprintf("%d\n",lwz::rand);return 0;
}
2.namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。
3.C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。
4.namespace只能定义在全局,当然他还可以嵌套定义。
像是这样:
namespace a
{namespace b{int Add(int x, int y){return x + y;}}namespace c{int Add(int x, int y){return x + y;}}
}
int main()
{printf("%d\n", a::b::Add(1, 2));printf("%d\n", a::c::Add(2, 2));return 0;
}

这里我在命名空间a里嵌套了两个命名空间b和c,在我们使用的时候,用::就可以访问命名空间里的东西了。

5.项目工程中多文件中定义的同名namespace会认为是⼀个namespace,不会冲突。
这句话的意思就是,假如我创建了多个.cpp的文档,并且我都创建了一个名字为lwz的命名空间,那么在运行的时候,会认为这些文档里lwz都是一个东西,可以理解为把所有名字为lwz的命名空间都合在一起了。
6.C++标准库都放在⼀个叫std(standard)的命名空间中。

1.3命名空间的使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以
下⾯程序会编译报错。所以我们要使用命名空间中定义的变量/函数,有三种方式:
指定命名空间访问,项目中推荐这种方式。
这种方式就是上面我一直用到的方式:
namespace lwz
{int a = 0;int b = 10;
}
int main()
{printf("%d\n", lwz::a);printf("%d\n", lwz::b);return 0;
}
using将命名空间中某个 成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。
展开的方式也可以使用,但是风险很大:
namespace lwz
{int a = 0;int b = 10;
}
using namespace lwz;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}

using的作用就是展开我们的命名空间,可以理解为把lwz域里的东西拿到全局域里。当然也可以单独的把命名空间里的某个特殊成员展开。

namespace lwz
{int a = 0;int b = 10;
}
using lwz::a;
int main()
{printf("%d\n", a);printf("%d\n", lwz::b);return 0;
}

二.输入输出

虽然C++是兼容C语言的,但是C++还是有自己的一套输入输出。我先简单的写一个输入输出:

#include<iostream>
using namespace std;
int main()
{int a = 0;double b=0.0;char c = 'a';std::cout << a << " " << b << " " << c <<std::endl;//我们在输出时可以自动的识别变量的类型cin >> a >> b >> c;//输入1 2.222 xcout << a << " " << b << " " << c << endl;//输出1 2.222 xreturn 0;
}
<iostream> 是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输 出对象。
std::cin 是 istream 类的对象,它主要面向窄字符(narrow characters (of type char))的标准输入 流。
std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流。
std::endl 是⼀个函数,流插入输出时,相当于插入⼀个换行字符加刷新缓冲区。
<<是流插入运算符,>>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)
使⽤C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入 输出可以自动识别变量类型(本质是通过函数重载实现的),其实最重要的是 C++的流能更好的支持自定义类型对象的输入输出。
cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要 通过命名空间的使用方式去用他们。
⼀般日常练习中我们可以using namespace std,实际项开发中不建议using namespace std。
我们没有包含<stdio.h>,也可以使printf和scanf,在包含<iostream>间接包含了。vs系列 编译器是这样的,其他编译器可能会报错。

三.缺省参数

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

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

打印出的就是0  10.

全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

#include<iostream>
using namespace std;
void func1(int a=10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
void Func2(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
int main()
{func1();func1(1);func1(1, 2);func1(1, 2, 3);Func2(100);Func2(100, 200);Func2(100, 200,300);return 0;
}

值得注意的是,在半缺省里,函数不可以是void Func2(int a=10, int b, int c = 20)或者void Func2(int a=10, int b, int)。

带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。

这里也就刚好对应上面的那一条,半缺省参数必须是从右往左依次连续缺省。

函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省
值。
这里我来解释一下这句话,当时我在用C语言实现栈的时候,我把函数的声明和定义放到了两个文档里面。此时的声明和定义是分离的,在实现栈的初始化的时候,我们可以用一个缺省参数来实现:
首先这是Stack.h文件:
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
void STInit(ST* ps, int n = 4);

此时我们已经在Stack.h文件里已经有了缺省参数,然后是.cpp文件:

#include"Stack.h"
void STInit(ST* ps, int n=10)
{assert(ps && n > 0);ps->a = (STDataType*)malloc(n * sizeof(STDataType));ps->top = 0;ps->capacity = n;
}

如果继续再函数定义这里还有缺省参数的话,就会导致重定义的问题出现。所以一定要是在函数声明给缺省值。

四.函数重载

C++支持在同⼀作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。

4.1参数类型不同

#include <iostream>
#include <assert.h>
using namespace std;
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}
int main()
{Add(1, 2);Add(1.23, 2.13);return 0;
}

最终打印出“”

4.2参数个数不同

void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
int main()
{f();f(10);return 0;
}

最后打印出:

 

4.3参数顺序不同

这个实际上也是参数类型不同

void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}

最终打印出:

 

4.4其他情况 

值得注意的是,返回值不同不能作为重载条件,因为调用的时候也无法区分。

包括还有一种情况也会报错:

void f1()
{
cout << "f()" << endl;
}
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}

假如我调用的时候没有参数,编译器就不知道调用谁。

到这里我简单的介绍了几个简单的C++的语法,也是C++入门必须要知道的东西,如有错误还请多多指出,感谢观看。 

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

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

相关文章

开放式耳机哪个品牌比较好?2024最值得推荐的火爆机型!!

在这个快节奏的时代&#xff0c;我们都在寻找那些既能让我们享受音乐&#xff0c;又能保持对外界感知的音频设备。开放式耳机以其独特的设计&#xff0c;满足了这一需求&#xff0c;它们让你在享受音乐的同时&#xff0c;还能听到周围环境的声音&#xff0c;无论是安全出行还是…

华为、H3C、锐捷、思科四大设备厂商交换机配置命令总结合辑

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 一直以来&#xff0c;对于华为、H3C、锐捷、思科交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;四…

OpenSNN推文:盛夏智慧之光:七月高校新闻聚焦

随着夏日的炎炎热浪逐渐升温&#xff0c;七月的校园生活也如火如荼地展开。在这个充满活力的季节里&#xff0c;各大高校不仅迎来了学术交流的高峰&#xff0c;也在科技创新、国际合作等方面取得了显著成就。以下是本月内几所知名高校的重要新闻动态&#xff0c;它们不仅展现了…

数据库 视图

-- 删除旧的视图&#xff08;如果存在&#xff09; DROP VIEW IF EXISTS view_employees_active; -- 创建新的视图 CREATE VIEW view_employees_active AS SELECT id, name FROM employees WHERE status active; 注意事项 如果视图不满足更新条件&#xff08;如包含JOIN、…

谱瑞科技高速传输接口芯片选型应用

谱瑞科技股份有限公司为一专供多种普及显示器以及个人计算机、消费性电子产品与显示面板所使用之高速讯号传输接口标准之混和信号 IC 芯片之领导供货商。谱瑞公司成立于 2005 年为一无自有晶圆厂之半导体公司&#xff0c;并于 2011 年股票在台湾柜台买卖中心正式挂牌交易(股票代…

深入浅出:Scikit-Learn基础教程

引言 Scikit-Learn&#xff08;简称sklearn&#xff09;是Python中一个强大的机器学习库&#xff0c;提供了丰富的工具和模块&#xff0c;帮助我们轻松实现数据预处理、模型训练、评估和预测。本文将通过一个简单的教程&#xff0c;带您快速入门Scikit-Learn&#xff0c;掌握其…

Greenplum(三)【分布式事务和两阶段提交协议】

1、事务实现原理和 WAL&#xff08;单机&#xff09; 属性含义数据库系统实现Atomic&#xff08;原子性&#xff09;事务中的操作要么全部正确执行&#xff0c;要么完全不执行&#xff08;要么成功、要么失败&#xff09;Write Ahead Logging 预写日志&#xff0c;分布式事务&…

C语言希尔排序详解与实例

希尔排序&#xff08;Shell Sort&#xff09;&#xff0c;是由Donald Shell在1959年提出的一种排序算法。它是插入排序的一种高效改进版&#xff0c;通过引入“增量”概念&#xff0c;将原本的线性查找转换为分段查找&#xff0c;从而显著提升了排序效率。本文将深入探讨希尔排…

SRC漏洞挖掘技巧:修改返回包的各种姿势

听说大家都在要星标&#xff0c;我也要一个吧&#xff0c;可以把我的公众号打上小星星吗&#xff1f;~ 又双叕周一了&#xff0c;还是老样子&#xff0c;来篇技术向的给大家提提神吧~ 如果你对漏洞挖掘或技术向不感兴趣&#xff0c;那么到这就可以了&#xff0c;不用再继续往下…

【删库跑路】一次删除pip下载的所有第三方库方法

进入命令行&#xff0c;先list看下库存 pip list导出所有的第三方库至一文件列表 pip freeze >requirements.txt按照列表卸载所有库 pip uninstall -r requirements.txt -y再list看下&#xff0c;可见库存已清空

1、课程导学(react+区块链实战)

1、课程导学&#xff08;react区块链实战&#xff09; 1&#xff0c;课程概述&#xff08;1&#xff09;课程安排&#xff08;2&#xff09;学习前提&#xff08;3&#xff09;讲授方式&#xff08;4&#xff09;课程收获 2&#xff0c;ibloackchain&#xff08;1&#xff09;安…

java:字符缓冲流特有功能

BufferedWriter&#xff1a; void newLine&#xff08;&#xff09;&#xff1a;写一行行分隔符&#xff0c;行分隔符字符串由系统属性定义 BufferedReader&#xff1a; public String readLine&#xff08;&#xff09;&#xff1a;读一行文字&#xff0c;结果包含行的内容的字…

振动分析-11-轴承数据库之深度学习一维故障分类Transformer

Pytorch-Transformer轴承故障一维信号分类(三) 1 制作数据集 import pandas as pd filename = "CWRU_1797.csv" df = pd.read_csv(filename)from sklearn.model_selection import train_test_split df_x=df.drop(labels=1024,axis=1)

AI赋能OFFICE 智能化办公利器!

ONLYOFFICE在线编辑器的最新版本8.1已经发布&#xff0c;整个套件带来了30多个新功能和432个bug修复。这个文档编辑器无疑成为了办公软件中的翘楚。它不仅支持处理文本文档、电子表格、演示文稿、可填写的表单和PDF&#xff0c;还允许多人在线协作&#xff0c;并支持AI集成&…

java Pair怎么使用

文章目录 1. 简介2. Pair类的来源3. 如何使用Pair类4. Pair类的实际应用5. Pair类的优点和缺点 1. 简介 什么是Pair Pair是一个通用的数据结构&#xff0c;用于存储一对关联的对象&#xff0c;也就是两个元素。这两个元素可以是任何类型&#xff0c;并且它们之间没有特定的层次…

哪些独立站外链策略最有效?

在当前的SEO领域中&#xff0c;独立站外链策略的效果差异很大&#xff0c;但GPB外链无疑是其中最为有效的一种。GPB外链&#xff0c;指的是通过高质量、包收录且dofollow的顶级域名独立站来获得外链&#xff0c;这种外链策略能够显著提升目标网站的整体排名数据。 关键词排名的…

redis学习(007 实战:黑马点评:登录)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第25p-第p34的内容 文章目录 短信登录功能session 共享问题 短信登录功能 接口编写 这里是Result的封装 过滤器在拦截器的外层…

go语言的堆排序实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、intheap的堆排序接口二、节点的堆排序实现三、leetcode 23. 合并 K 个升序链表 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、in…

淘宝详情的 API 探秘:获取与运用全攻略

在电商领域&#xff0c;淘宝无疑是一座巨大的宝库&#xff0c;其中丰富的商品详情信息对于商家、开发者和数据分析人员来说具有极高的价值。而通过 API 接口来获取淘宝详情&#xff0c;则为我们打开了一扇高效获取这些信息的大门。 一、为什么要获取淘宝详情 首先&#xff0c;…

嵌入式系统中的实时操作系统任务调度策略

嵌入式系统中的实时操作系统任务调度策略 在嵌入式系统中&#xff0c;实时任务调度是确保系统响应性和稳定性的关键方面之一。不同的任务调度策略可以影响系统的性能和实时性。本文将深入探讨两种常见的实时任务调度策略&#xff1a;固定优先级调度和循环时间片调度&#xff0…