【C++】C++入门(上)

news2024/11/27 12:51:01

前言:

  C++是在C语言的基础上不断添加东西形成的一门语言,在C语言的基础上引入了面向对象的思想。因此C++既是面向对象的语言,也是面向过程的语言。因为C++是以C语言为基础的,所以基本上C++兼容所有的C语言。目前最常用的版本是C++98和C++11这两个版本。
  因为C语言是一个比较早期的语言,在许多方面是存在缺陷的,所以C++在C语言的基础上加了许多东西,比如:命名空间、缺省参数、函数重载、引用、模板等。另外需要知道的一个概念是,语言的更新只能向前兼容,之前存在的东西有缺陷,只能通过打补丁来解决,而不能从根本上去解决问题。因为有可能这一缺陷已经被使用在了项目工程之中,如果改掉就会导致项目工程出现一些难以预料的BUG。

命名空间:

什么是命名空间?为什么要设置一个命名空间?
  变量、函数和类的名称都存在于全局作用域中,在一个大一点的项目中,这些名称就可能会存在冲突。命名空间的存在就是为了解决这一问题。命名空间可以对标识符的名称进行本地化,从而达到避免命名冲突或名字污染的情况。命名空间的关键字是namesapce
  命名空间相当于定义了一个新的作用域,命名空间内的所有内容都局限在该命名空间中。但是命名空间并不影响内容的声明周期。
命名空间的定义:

namespace NS
{
	// 命名空间中可以定义变量/函数/类型
	int rand = 10;
	int Add(int left, int right)
	{
		return left + right;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
}
//命名空间可以嵌套
namespace N1
{
	int a;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace N2
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}
//同一个工程中允许存在很多个相同名称的命名空间,编译器最后会合成到同一个命名空间中
namespace N1
{
	int Mul(int left, int right)
	{
		return left * right;
	}
}

命名空间的使用:

namespace use1
{
	int a = 1;
	int b = 2;
}
namespace use2
{
	int c = 3;
}
//使用using将命名空间中某个成员引入
using use1::b;
//使用using namespace 命名空间名称 引入
using namespace use2;
int main()
{
	//命名空间名称及作用域限定符
	printf("%d\n", use1::a);

	printf("%d\n", b);

	printf("%d\n", c);

	return 0;
}

在这里插入图片描述

C++的输入输出:

//std是C++标准库的命名空间名,C++标准的定义实现都放在这个命名空间中
//前期学习可以直接将std引入
using namespace std;

int main()
{
	cout << "hello world" << endl;

	int a;
	double b;
	char c;

	//C++可以自动识别变量的类型
	cin >> a;
	cin >> b >> c;

	cout << a << endl;
	cout << b << " " << c << endl;


	return 0;
}

在这里插入图片描述
  使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须要包含头文件以及按命名空间使用方法来使用std;
  cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在头文件中;
  <<是流插入运算符,>>是流提取运算符;
  使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型;
  cout和cin分别是ostream和istream类型的对象,>>和<<也涉及到运算符的重载。

缺省参数:

  缺省参数是声明或定义函数时为函数的参数指定一个缺省值(默认值),在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

#include <iostream>

using namespace std;
//缺省参数不能在函数声明和定义时,同时出现
// 缺省值必须是常量或全局变量
//全缺省参数
void Func(int a = 10, int b = 20, int c = 30)
{
	cout << a << " ";
	cout << b << " ";
	cout << c << endl;
}
//半缺省参数
//半缺省参数必须从右到左依次给出,不能有间隔
void Func1(int a, int b = 20, int c = 30)
{
	cout << a << " ";
	cout << b << " ";
	cout << c << endl;
}

int main()
{
	Func();
	//缺省参数必须从左到右连续使用,不能出现形如Func(1, , 2)的写法
	Func(1);
	Func(1, 2);
	Func(1, 2, 3);

	return 0;
}

函数重载:

什么是函数重载?
  C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表不同(参数个数或类型或类型顺序),常用来处理实现功能类似数据类型不同的问题。

#include <iostream>
using namespace std;
//参数类型不同
int Add(int left, int right)
{
	return left + right;
}
double Add(double left, double right)
{
	return left + right;
}
//参数个数不同
int Sub(int max, int min)
{
	return max - min;
}
int Sub(int max, int min1, int min2)
{
	return max - min1 - min2;
}
//类型顺序不同
void func(char a, int b)
{
	cout << a << " " << b << endl;
}
void func(int a, char b)
{
	cout << a << " " << b << endl;
}
int main()
{
	cout << Add(1, 2) << endl;
	cout << Add(1.1, 1.2) << endl;

	cout << Sub(10, 1) << endl;
	cout << Sub(10, 1, 2) << endl;

	func('a', 3);
	func(5, 'b');

	return 0;
}

为什么C++能识别重载函数,而C语言不行?
  因为C语言编译之后的结果,函数名并没有修饰,我们在代码中写的什么样就是什么样。但是C++的函数名是按照一定规则被修饰了的,不同的编译器在不同的环境中修饰规则也是有区别的,所以C++能识别重载函数,而C语言不能。
  如果两个函数的函数名和参数是一样的,返回值不同,是不能够构成重载的,因为调用时编译器没法区分。

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

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

相关文章

Java通过SNMP4J管理设备

一、Windows开启SNMP服务这里以Windows11为例&#xff1a;1、安装SNMP服务(1)通过winx快捷键打开电脑“设置”&#xff0c;然后在“应用”中选择”可选功能“。(2)点击”可选功能“的”查看功能“(3)找到并勾选“WMI SNMP 供应商"&#xff0c;再点击”下一步“。这里借用下…

【MySQL】sql中explain解释和应用

这里写目录标题学习原因MySQL中explain的使用和用法解释explain的使用explain 运行结果的意义文字展示表格展示参考资料&#xff1a;结束语学习原因 在对sql的优化过程中使用了explain对指定的sql进行查看它的运行效果&#xff0c;以便找出sql的性能特点并进行优化 MySQL中ex…

20230222解决在WIN7下的UltraEdit9不能新建文件但是可以打开TXT文件

20230222解决在WIN7下的UltraEdit9不能新建文件但是可以打开TXT文件 2023/2/22 17:34 UltraEdit-32 Cannot edit file Cant create tempory file 确定 解决方式&#xff1a; C:\Users\Administrator\AppData\Local\Temp目录下的内容清除即可。 Temp文件夹竟然写满了&#xff…

Python进阶知识

目录 一、装饰器和闭包 1、装饰器 decorator 2、闭包 closure 二、迭代器与生成器 二、面向对象编程 1、概念 2、类和对象 2.1 概念 2.2 定义类和创建对象 2.3 __init__(self): 2.4 self的理解 3、魔术方法 3.1__str__() 3.2 __new__() 4、析构方法 5、类的继…

在CentOS-7.9配置vsftpd服务

文章目录一 vsftpd简介二 环境准备三 服务部署3.1 安装软件3.2 编写配置文件3.3 用户授权3.4 启动服务3.5 文件传输测试3.5.1 Windows到Linux3.5.2 filezilla3.5.3 从Linux到Linux一 vsftpd简介 FTP是 File Transfer Protocol 文件传输协议的简称。 VSFTP是 Very Security FTP…

【QT】史上最全最详细的QSS样式表用法及用例说明

目录1. Qt样式表语法2. 选择器2.1 可设置样式的部件2.2 选择器类型2.3 子控件2.4 伪状态3. 属性列表4. 冲突解决5. qss示例1. Qt样式表语法 Qt样式表支持各种属性、伪状态和子控件&#xff0c;可以自定义小部件的外观。 selector { attribute: value }selector:选择器&#xf…

Android Gradle 学习笔记(四)构建块基本单元掌握

本篇主要学习 Gradle 构建脚本的三个基本组建成&#xff1a; project 项目task 任务property 属性 我将会重点介绍 Task&#xff0c;因为它是所有基础中的基础&#xff0c; project 的知识更多和实战有关&#xff08;例如模块化&#xff09;&#xff0c;而 property 本身不过…

新手怎么快速学会并上手SQL语言?收藏版

SQL可以说是程序员、数据库管理员DBA、数据分析师等需要做数据处理和分析岗位最常用的程序语言了。 尤其是一些岗位&#xff0c;工作中并非以数据库为核心&#xff0c;只是偶尔用些数据不需要深度学习&#xff0c;不得不自己去做一些取数的事情&#xff0c;只要学会通过SQL取数…

PS_高低频和中性灰——双曲线

高低频 高低频磨皮&#xff1a;把皮肤分成两个图层&#xff0c;一层是纹理层也就是皮肤的毛孔。 一层是皮肤光滑层没有皮肤细节。 高频”图层为细节层&#xff0c;我们用图章工具修高频 “低频”图层为颜色层&#xff0c;我们用混合画笔修低频 原理&#xff1a;修颜色亮度光影…

用户投稿——详解我了解的 TDengine 以及它所在的时序数据库“战场”

作者&#xff1a;大数据模型本篇文章出自 2022 年“用 TDengine&#xff0c;写 TDengine”征文投稿活动。因为工作的关系&#xff0c;最近几年我接触到过各种国产数据库&#xff0c;唯独对 TDengine 念念不忘。在众多数据库中&#xff0c;TiDB 一枝独秀&#xff0c;OceanBase 出…

渗透中超全的Google hack语法

inurl:Login 将返回url中含有Login的网页intitle:后台登录管理员 将返回含有管理员后台的网页intext:后台登录 将返回含有后台的网页inurl:/admin/login.php 将返回含有admin后台的网页inurl:/phpmyadmin/index.php 将返回含有phpmyadmin后台的网页site:http://baidu.com inur:…

OpenStack手动分布式部署Keystone【Queens版】

目录 Keystone简介 1、登录数据库配置&#xff08;在controller执行&#xff09; 1.1登录数据库 1.2数据库里创建keystone 1.3授权对keystone数据库的正确访问 1.4退出数据库 2、数据库导入Keystone表&#xff08;在controller执行&#xff09; 2.1安装httpd mod_wsgi 2.2备…

nn.Conv2d与nn.Conv3d介绍

nn.Conv2d 1&#xff09;输入的维度为&#xff1a; 2&#xff09;输出的维度为&#xff1a; 其中&#xff0c;Cout是由参数out_channels&#xff08;(int) – 卷积产生的通道数&#xff09;决定。 Hout和Wout计算如下&#xff1a; 3&#xff09;在池化层的计算&#xff1a; …

Windows服务器使用cwRsync实现同步

软件分为客户端和服务器端 实现目的&#xff1a;将服务端C:\tongbu目录中的文件定时同步到客户端C:\target目录中去。 cwRsyncServer&#xff08;服务端&#xff09;配置步骤 1.双击运行wRsyncServer_4.1.0_Installer.exe。 2.这里创建的账户是操作系统的&#xff0c;创建的…

canvas初体验

canvas介绍 Canvas 最初由Apple于2004 年引入&#xff0c;用于Mac OS X WebKit组件&#xff0c;为仪表板小部件和Safari浏览器等应用程序提供支持。后来&#xff0c;它被Gecko内核的浏览器&#xff08;尤其是Mozilla Firefox&#xff09;&#xff0c;Opera和Chrome实现&#x…

webpack实现静态资源缓存

一、配置缓存 我们使用 webpack 来打包我们的模块化后的应用程序&#xff0c;webpack 会生成一个可部署的/dist目录&#xff0c;然后把打包后的内容放置在此目录中。只要/dist目录中的内容部署到 server 上&#xff0c;client&#xff08;通常是浏览器&#xff09;就能够访问此…

OKR之剑·总结篇01:如何开好一场OKR复盘会

作者&#xff1a;vivo 互联网平台产品研发团队 本文是《OKR 之剑》系列之总结第 1 篇—— OKR复盘是OKR生命周期中的重要环节&#xff0c;起着承上启下的重要作用。本篇将和你一起探讨什么是OKR复盘、为什么要进行OKR复盘&#xff0c;接着向你展示团队在OKR复盘方面的实践和改…

【MyBatis】代理开发核心配置文件介绍(二)

&#x1f697;MyBatis学习第二站站~ &#x1f6a9;起始站&#xff1a;MyBatis概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 &#x1f44d;希望您能有所收获 一.Mapper代理开发 (1) 引入 在上一篇中我们有提到一点&#xff0c;MyBatis可以…

Linux原来是这么管理内存的(最透彻的一篇)

Linux 内存管理模型非常直接明了&#xff0c;因为 Linux 的这种机制使其具有可移植性并且能够在内存管理单元相差不大的机器下实现 Linux&#xff0c;下面我们就来认识一下 Linux 内存管理是如何实现的。 基本概念 每个 Linux 进程都会有地址空间&#xff0c;这些地址空间由三…

堆的概念和结构以及堆排序

前言 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事&#xff0c…