【C++】C++入门基础--命名空间,缺省参数,函数重载

news2024/9/21 2:43:32

文章目录

  • 前言
  • 一、C++是什么?
  • 二、C++发展历史
    • C++版本更新
    • C++参考文档
  • 三、C++基本语法
    • 1.第一个C++程序
    • 2.命名空间
      • 2.1命名空间的价值
      • 2.2命名空间的定义
      • 2.3命名空间的使用
    • 3.C++的输入与输出
    • 4.缺省参数
    • 5.函数重载
  • 总结


在这里插入图片描述

前言

在编程的浩瀚宇宙中,C++犹如一颗璀璨的明星,以其高效、灵活与强大,吸引着无数开发者的眼球。本文旨在为初学者搭建一座通往C++世界的桥梁,帮助读者建立扎实的C++基础知识体系,激发探索复杂程序设计的兴趣,开启一段充满挑战与乐趣的编程之旅。让我们一起,用代码编织梦想,用智慧点亮未来!


一、C++是什么?

C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生 ,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。

二、C++发展历史

1970年,AT&T贝尔实验室的工作人员D.Ritchie和K.Thompson共同研发了C语言。研制C语言的初衷是用它编写UNIX系统程序,因此,实际上C语言是UNIX的“副产品”。

1971年,瑞士联邦技术学院N.Wirth教授发明了第一个结构化的编程语言Pascal。
20世纪70年代中期,本贾尼·斯特劳斯特卢普在剑桥大学计算机中心工作。斯特劳斯特卢普希望开发一个既要编程简单、正确可靠,又要运行高效、可移植的计算机程序设计语言。而以C语言为背景,以Simula思想为基础的语言,正好符合斯特劳斯特卢普的初衷和设想。

1979年,本贾尼·斯特劳斯特卢普到了AT&T贝尔实验室,开始从事将C改良为带类的C(C with classes)的工作。1983年,该语言被正式命名为C++。

1985年、1990年和1994年,C++先后进行3次主要修订。
C++的标准化工作于1989年开始,并成立了一个ANSI和ISO(International Standards Organization)国际标准化组织的联合标准化委员会。
1994年1月25曰,联合标准化委员会提出了第一个标准化草案。在该草案中,委员会在保持斯特劳斯特卢普最初定义的所有特征的同时,还增加了部分新特征。
在完成C++标准化的第一个草案后不久,亚历山大·斯特潘诺夫(Alexander Stepanov)创建了标准模板库(Standard Template Library,STL)。在通过了标准化第一个草案之后,联合标准化委员会投票并通过了将STL包含到C++标准中的提议。STL对C++的扩展超出了C++的最初定义范围。虽然在标准中增加STL是个很重要的决定,但也因此延缓了C++标准化的进程。

1997年11月14日,联合标准化委员会通过了该标准的最终草案。
1998年,C++的ANSI/IS0标准被投入使用。
在这里插入图片描述

C++版本更新

在这里插入图片描述

C++参考文档

链接: https://legacy.cplusplus.com/reference/
链接: https://zh.cppreference.com/w/cpp
链接: https://en.cppreference.com/w/

第⼀个链接不是C++官方文档,标准也只更新到C++11,但是以头文件形式呈现,内容比较易看好懂。后两个链接分别是C++官方文档的中文版和英文版,信息很全,更新到了最新的C++标准,但是相比第⼀个不那么易看;几个文档各有优势,我们结合着使用。

三、C++基本语法

1.第一个C++程序

代码如下(示例):

#include<stdio.h>
int main()
{
  printf("hello world\n");
 
  return 0;
}

在这里插入图片描述
C++兼容C语言绝大多数的语法,所以C语言实现的hello world依旧可以运行,C++中需要把定义文件代码后缀改为.cpp,vs编译器看到是.cpp就会调用C++编译器编译,linux下要用g++编译,不再是gcc。

#include<iostream>

using namespace std;
int main()
{
	cout << "Hello world" << endl;
	return 0;
}

在这里插入图片描述
严格来说这是C++版本的Hello World,现在可能还看不明白这段代码,但我们在接下来的学习中,就会逐渐明白。

2.命名空间

2.1命名空间的价值

C/C++中会存在许多的变量,函数,类,他们的名称都存在于全局作用域中。在一个比较大的工程中可能会出现名字的重复使用而造成冲突。所以我们引入了命名空间的概念,将标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

2.2命名空间的定义

• 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

• namespace本质是定义出⼀个域,这个域跟全局域各自独离,不同的域可以定义同名变量。

• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的声明周期,命名空间域和类域不影响变量声明周期。

• namespace只能定义在全局,当然他还可以嵌套定义。

• 项目工程中多文件中定义的同名namespace会认为是⼀个namespace,不会冲突。

• C++标准库都放在⼀个叫std(standard)的命名空间中。

举个例子

namespace wyx
{
	int rand;//因为rand在wyx空间内,所以不会与库函数rand()冲突
	int Add(int a, int b)
	{
		return a + b;
	}
	struct node
	{
		char val;
		struct node* next;
	};
}

当有许多个同名的变量在不同的域中时,我们使用::来确定使用哪一个变量.在::左侧写域的名字,在::的右侧写变量的名字。

namespace wyx
{
 int rand=0;
}
int rand=1;
int main()
{
   // 这⾥默认是访问的是全局的rand函数指针
   printf("%p\n", rand);
   // 这⾥指定bit命名空间中的rand
   printf("%d\n", wyx::rand);
   return 0;
}

在这里插入图片描述

namespace可以嵌套定义,如下,当我们嵌套定义时,想要访问到正确的变量,就要多用几个::从外到内表示清楚路径。

namespace wyx
{
	namespace ww
		{
		int rand = 1;
		int Add(int a, int b)
		{
			return a + b;
		}
	}

	namespace yy
	{
		int rand = 2;
		int Add(int a, int b)
		{
			return (a + b) * 2;
		}
	}
}
int main()
{
	printf("%d\n", wyx::ww::rand);
	printf("%d\n", wyx::yy::rand);
	printf("%d\n", wyx::ww::Add(1, 2));
	printf("%d\n", wyx::yy::Add(1, 2));
	return 0;
}

在这里插入图片描述

2.3命名空间的使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以我们要使用命名空间中定义的变量/函数,有三种方式:
• 指定命名空间访问,项目中推荐这种方式。
• using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
• 展开命名空间中全部成员,项目不推荐,冲突风险很大

namespace wyx
{
 int a = 0;
 int b = 1;
}
//指定命名空间访问,就是上文中讲的::符号
int main()
{
 printf("%d\n", wyx::a);
 return 0; 
}
// using将命名空间中某个成员展开,一般是展开常用的变量,方便使用。
using wyx::b;
int main()
{
 printf("%d\n", wyx::a);
 printf("%d\n", b);
 return 0; 
}
// 展开命名空间中全部成员,容易造成命名冲突,不建议
using namespce wyx;
int main()
{
 printf("%d\n", a);
 printf("%d\n", b);
 return 0; 
}

3.C++的输入与输出

• < iostream >是Input Output Stream的缩写,是标准的输入、输出流库,定义了标准的输⼊、输出对象。

• std::cin是istream类的对象,它主要⾯向窄字符的标准输入流。

• std::cout是ostream类的对象,它主要面向窄字符的标准输出流。

• std::endl是⼀个函数,流插⼊输出时,相当于插入⼀个换行字符加刷新缓冲区。

• <<是流插入运算符,>>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)

• 使⽤C++输⼊输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现的),其实最重要的是C++的流能更好的支持自定义类型对象的输入输出。

• cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去用他们。

• 没有包含<stdio.h>,也可以使用printf和scanf,在包含< iostream >间接包含了。vs系列编译器是这样的,其他编译器可能会报错。

例如

int main()
{
	int a = 0;
	double b = 3.14;
	char c = 'x';
	cout << a << " " << b << " " << c << endl;
	cin >> a;
	cin >> b >> c;
	cout << a << " " << b << " " << c << endl;
	return 0;
}

在这里插入图片描述

int main()
{
 // 在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码
 // 可以提⾼C++IO效率
 ios_base::sync_with_stdio(false);
 cin.tie(nullptr);
 cout.tie(nullptr);
 return 0;
 //或者不使用cin和cout。直接使用scanf和printf。
}

4.缺省参数

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

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

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

• 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。

void Fun(int a = 0)
{
 cout << a << endl;
}
int main()
{
 Fun(); // 没有传参时,使⽤参数的默认值
 Fun(5); // 传参时,使⽤指定的实参
 return 0;
}

在这里插入图片描述

// 全缺省
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;
}

在定义和声明中,我们只在函数声明中给出缺省值,在定义中不写入缺省值,不然会报错。

5.函数重载

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

// 1、参数类型不同
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;
}
// 2、参数个数不同
void fun()
{
 cout << "fun()" << endl;
}
void fun(int a)
{
 cout << "fun(int a)" << endl;
}
// 3、参数类型顺序不同
void fun(int a, char b)
{
 cout << "fun(int a,char b)" << endl;
}
void fun(char b, int a)
{
 cout << "fun(char b, int a)" << endl;
}

但下面这几个就比较特殊

// 返回值不同不能作为重载条件,因为调⽤时也⽆法区分
void fun()
{}

int fun()
{
 return 0;
}

// 下⾯两个函数构成重载
// f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁
void fun()
{
 cout << "fun()" << endl;
}
void fun(int a = 10)
{
 cout << "fun(int a)" << endl;
}

总结

以上就是今天的全部内容,主要介绍了一些C++的基础内容,C++的内容还有许多,如果喜欢这篇博客,期待你的一键三连。

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

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

相关文章

MySQL手注之布尔型盲注详解

布尔型盲注简介 基于布尔型SQL盲注即在SQL注入过程中&#xff0c;应用程序仅仅返回True&#xff08;页面&#xff09;和False&#xff08;页面&#xff09;。 这时&#xff0c;我们无法根据应用程序的返回页面得到我们需要的数据库信息。但是可以通过构造逻辑判断&#xff08;…

C++语言学习精简笔记(包含C++20特性)

目录 1 C新语法C与CC编译运行String编程范式C基础类型**自动类型推导**统一对象初始化&#xff1a;Uniform Initialization 控制结构if语句for语句switch语句namespace 2 函数函数声明形式参数函数参数传递的选择函数返回值的选择 函数重载 Lambda表达式函数的定义和申明生存期…

算法之工程化内容(2)—— Git常用命令

目录 1. git初始化配置 2. 新建仓库 3. 工作区——>暂存区——>本地仓库 4. git reset回退版本 5. 查看差异 git diff 6. 删除文件git rm 7. .gitignore 8. vscode操作git 9. git分支、合并和删除 10. 解决合并冲突 11. 回退和rebase 12. 添加远程仓库 参考链接&#xff…

6.824/6.5840 的Debugging by Pretty Printing配置

TA的原文在&#xff1a;Debugging by Pretty Printing (josejg.com) 为了在WSL2中配置好打印运行日志&#xff0c;我可是忙活了一下午。可恶的log配置 首先是安装rich库Textualize/rich: Rich is a Python library for rich text and beautiful formatting in the terminal. …

Android布局简介

布局是一种可用于放置很多控件的容器&#xff0c;根据既定的规则决定内部控件的位置。当然&#xff0c;布局的内部也可以放置布局&#xff0c;即布局嵌套&#xff0c;布局嵌套可以实现一些比较复杂的界面。 Android中有多种编写程序界面的方式可供选择。Android Studio提供了相…

Android应用程序调试Logcat的使用

Android的程序调试主要使用Logcat进行&#xff0c;本节主要介绍Logcat的使用。 开启调试模式 使用Android Studio进行程序调试&#xff0c;首先需要连接虚拟Android设备或真实Android设备&#xff0c;设备上需要启用调试功能。 虚拟Android设备默认情况下会启用调试功能。对…

超详细!Jmeter 压测-设计5W并发量场景

需求&#xff1a;设计一个5W并发量的性能场景&#xff1f; 1、确定性能测试工具&#xff0c;性能测试思路 测试工具&#xff1a;Jmeter 并发设计思路&#xff1a;如果被测服务足够快&#xff0c;比如10ms的响应时间&#xff0c;1个线程/秒就是100tps&#xff0c;5万的TPS&…

Redis代替Session实现共享

集群的session共享问题 session共享问题&#xff1a;多台tomcat并不共享session存储空间&#xff0c;当请求切换到不同的tomcat服务时导致数据丢失的问题。 session的替代方案&#xff1a; 数据共享内存存储key、value结构 将redis替换session可以解决session共享问题

AI发展的新方向:从卷模型到卷应用

在2024年7月4日于上海世博中心举办的世界人工智能大会暨人工智能全球治理高级别会议全体会议上&#xff0c;百度创始人、董事长兼首席执行官李彦宏发表了一段引人深思的演讲。他在产业发展主论坛上提出&#xff1a;“大家不要卷模型&#xff0c;要卷应用&#xff01;”这句话道…

打卡第7天-----哈希表

继续坚持✊,我现在看到leetcode上的题不再没有思路了,真的是思路决定出路,在做题之前一定要把思路梳理清楚。 一、四数相加 leetcode题目编号:第454题.四数相加II 题目描述: 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j…

设计模式使用简例(简单工厂+策略模式+模板方法)

直接上代码&#xff0c;方便记忆。主要的要点&#xff0c;已经写到注释中。 一&#xff0c;代码展示 启动类 package com.rojer;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootAppli…

【电路笔记】-C类放大器

C类放大器 文章目录 C类放大器1、概述2、C类放大介绍3、C类放大器的功能4、C 类放大器的效率5、C类放大器的应用:倍频器6、总结1、概述 尽管存在差异,但我们在之前有关 A 类、B 类和 AB 类放大器的文章中已经看到,这三类放大器是线性或部分线性的,因为它们在放大过程中再现…

离线运行Llama3:本地部署终极指南_liama2 本地部署

4月18日&#xff0c;Meta在官方博客官宣了Llama3&#xff0c;标志着人工智能领域迈向了一个重要的飞跃。经过笔者的个人体验&#xff0c;Llama3 8B效果已经超越GPT-3.5&#xff0c;最为重要的是&#xff0c;Llama3是开源的&#xff0c;我们可以自己部署&#xff01; 本文和大家…

大话光学原理:3.干涉与衍射

一、干涉 这是一束孤独的光&#xff0c;在真空的无垠中悄无声息地穿行。忽然&#xff0c;一堵高耸的墙壁挡住了它的去路&#xff0c;它别无选择&#xff0c;只能硬着头皮冲撞而去。在摸索中&#xff0c;它意外地发现墙壁上竟有两道孔隙&#xff0c;笔直而细长&#xff0c;宛如量…

tableau树形图制作 - 7

树形图制作 1. 树状图绘制-11.1 选择属性1.2 智能选择树状图1.3 颜色设置 2. 树状图绘制-22.1 标签属性选择2.2 树状图绘制2.3 颜色设置2.4 设置标签2.5 设置筛选器 3. 树状图绘制 - 33.1 选择行列3.2 树状图转换3.3 统计转换3.4 颜色设置3.5 标签设置3.6 筛选器设置 1. 树状图…

【系统架构设计】计算机组成与体系结构(二)

计算机组成与体系结构 计算机系统组成存储器系统前言主存储器存储器存储数量&#xff08;计算&#xff09; 辅助存储器&#xff08;以磁盘为例&#xff09;Cache存储器 流水线 计算机系统组成 存储器系统 前言 存储器用来存放程序和数据的部件&#xff0c;是一个记忆装置&am…

Michael.W基于Foundry精读Openzeppelin第63期——Initializable.sol

Michael.W基于Foundry精读Openzeppelin第63期——Initializable.sol 0. 版本0.1 Initializable.sol 1. 目标合约2. 代码精读2.1 _getInitializedVersion() internal && _isInitializing() internal2.2 modifier initializer()2.3 modifier reinitializer(uint8 version…

Qt 异步实现事件的定时执行 - QTimer和QThread的联合使用

异步实现事件的定时执行 - QTimer和QThread的联合使用 引言一、核心源码二、其信号和槽函数简述三、定时器及其moveToThread简述 引言 在 Qt 中&#xff0c;如果想要定时执行某些事件或函数&#xff0c;通常会使用 QTimer 类。QTimer 允许设置一个时间间隔&#xff0c;当这个时…

聚星文社一键生成工具绘唐3科技AI工具

聚星文社一键生成工具绘唐3科技AI工具 绘唐3.0——用户文档 - 飞书云文档 聚星文社一键生成工具绘唐3科技AI工具是一个基于人工智能技术的辅助创作工具&#xff0c;可以帮助用户快速生成有关唐朝科技的文本内容。该工具利用自然语言处理和机器学习等技术&#xff0c;通过输入一…

opencv读取视频文件夹内视频的名字_时长_帧率_分辨率写入excel-cnblog

看视频的时候有的视频文件名贼长。想要翻看&#xff0c;在文件夹里根本显示不出来&#xff0c;缩短又会丢失一些信息&#xff0c;所以我写了一份Python代码&#xff0c;直接获取视频的名字&#xff0c;时长&#xff0c;帧率&#xff0c;还有分辨率写到excel里。 实际效果如下图…