当前位置: 首页 > news >正文

【C++】入门基础

前言:C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助,因此从今天开始们将进入C++的学习。

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:高质量C++学习 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


目录标题

  • C++入门
    • 什么是C++
    • C++发展史
    • C++ 关键字
    • 命名空间的使用
      • namspace的空间定义普通变量
      • 命名空间定义函数与类型
        • 命名空间定义函数
        • 命名空间定义类型
      • 使用using将命名空间中某个成员引入
      • 使用using将命名空间中某个成员引入
    • C++输入与输出
    • 缺省参数
      • 全缺省参数
      • 半缺省参数
    • 函数重载
      • 参数类型不同
      • 参数个数不同
      • 参数类型顺序不同


C++入门

什么是C++

C++是一种通用的编程语言,它是一种高级、静态类型的编程语言,同时也是一种面向对象的语言。C++是C语言的扩展,它继承了C语言的语法和功能,并添加了许多新的特性。C++支持面向对象的编程范式,包括封装、继承和多态性。它还提供了许多其他功能,如异常处理、模板元编程和标准模板库(STL),使程序员能够更高效地编写复杂的程序。
C++具有高性能和灵活性,可以用于开发各种类型的应用程序,包括桌面应用程序、嵌入式系统、游戏、图形界面应用程序、操作系统和网络应用程序等。由于其广泛的应用领域和强大的功能,C++已成为一种非常流行的编程语言。
总的来说,C++是一种功能强大、灵活且广泛应用的编程语言,适用于各种开发需求。


C++发展史

C++的发展可以追溯到20世纪80年代初。以下是C++发展的主要里程碑:

  1. 1980年:Bjarne Stroustrup在贝尔实验室开始将C语言扩展为C with Classes,这是C++的前身。通过添加类和对象的概念,C with Classes使得面向对象编程成为可能。

  2. 1983年:C with Classes改名为C++。C++的名称表示它是C语言的一个增强版,因为C++扩展了C语言的功能并添加了面向对象编程的特性。

  3. 1985年:在《C++程序设计语言》一书中,Stroustrup正式发布和介绍了C++语言。这本书成为学习C++的标准教材,并在学术界和工业界产生了广泛的影响。

  4. 1990年:C++的第一个国际标准(ISO/IEC 14882:1998)发布。这个标准为C++提供了一个统一的语法和语义规范,使得C++可以在不同的编译器和平台上进行跨平台开发。

  5. 1998年:C++的第二个国际标准(ISO/IEC 14882:2003)发布。这个标准引入了一些新的特性,如模板特化、异常规范和命名空间别名等。

  6. 2011年:C++的第三个国际标准(ISO/IEC 14882:2011)发布,通常被称为C++11。C++11引入了许多新的特性,如自动类型推导、Lambda表达式、右值引用和智能指针等。

  7. 2014年:C++的第四个国际标准(ISO/IEC 14882:2014)发布,通常被称为C++14。C++14对C++11进行了一些修正和改进,同时添加了一些新的功能。

  8. 2017年:C++的第五个国际标准(ISO/IEC 14882:2017)发布,通常被称为C++17。C++17增加了许多新的特性,如变量声明初始化、折叠表达式、结构化绑定和并行算法等。

  9. 2020年:C++的第六个国际标准(ISO/IEC 14882:2020)发布,通常被称为C++20。C++20引入了一系列新的特性,如概念、协程、范围和模块等。


C++ 关键字

在这里插入图片描述


命名空间的使用

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题。

#include<stdlib.h>
#include<stdio.h>
int rand = 1;//在C语言中,rand是其一个库函数的命名名字,因此会造成命名冲突int main()
{printf("%d\n", rand);// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决return 0;
}

在这里插入图片描述


namspace的空间定义普通变量

namespace space
{int rand = 10;
}//int rand = 1;int main()
{int rand = 3;printf("%d\n", space::rand);printf("%d\n", rand);return 0;
}

在这里插入图片描述

在上述示例中,我们定义了一个名为space的命名空间。命名空间中包含了一个整型变量。在main函数中,我们通过::来访问命名空间中的成员,在以前的C语言中,我们是无法解决同一个名字代表着两个不同的变量的,因此我们可以通过命名空间这一特点来充分解决我们在C语言的痛点。

命名空间定义函数与类型

命名空间定义函数

在C++中,命名空间不仅仅可以定义普通变量,还可以定义函数与类型

#include<iostream>
namespace Myspace
{int Add(int x, int y){return x + y;}
}int Add(int x, int y)
{return  x + y;
}int main()
{int n = 9;int m = 22;printf("%d\n",Myspace::Add(n, m));//通过命名空间,我们可以充分的解决函数命名冲突的问题return 0;
}

在这里插入图片描述


命名空间定义类型

对于结构体的命名空间的引用与其它的有些许不同,代码实例如下:

#include<iostream>
namespace Mystruct
{struct Node{int val;};
}int main()
{Mystruct::Node example;example.val = 10;printf("%d\n",example.val);return 0;
}

在这里插入图片描述


使用using将命名空间中某个成员引入

using声明:使用using关键字来声明一个特定的命名空间、类或者函数,以便在当前的作用域中直接使用该名称而无需完整的限定符,我们也可以通俗的理解成,让这个展开的变量或者函数成为了一个全局变量。如下所示:

#include<iostream>
namespace Myspace 
{int num1 = 10;int num2 = 20;int Add(int x, int y){return x + y;}
}using namespace Myspace;int main()
{printf("%d\n", num1);printf("%d\n", num2);printf("%d\n", Add(num1, num2));return 0;
}

在这里插入图片描述


使用using将命名空间中某个成员引入

#include<iostream>
namespace Mysapce
{int n1 = 20;int n2 = 10;
}using Mysapce::n1;//展开命名空间中的n1变量
int main()
{printf("%d\n", n1);return 0;
}

在这里插入图片描述


C++输入与输出

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
    以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
    iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
    C++的输入输出可以自动识别变量类型。
  5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,
    这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有
    一个章节更深入的学习IO流用法及原理
    C++是一种面向对象的编程语言,提供了丰富的输入和输出功能。下面是C++中常用的输入和输出方式的示例:
    标准输出流cout
    当然了,在我们学习C语言之初都会向这个全新的东西打一下招呼,这里我们也不例外,在C++中,cout会自动识别你所要打印的数据类型并输出,作为初学者这里我们就暂时不对这里的endlcout做具体的解释,我们目前只需要知道可以这么用即可。
#include<iostream>
int main()
{int n = 0;char m = 0;std::cout << "hello C++" << std::endl;return 0;
}

在这里插入图片描述


标准输入流cin
cin与我们在C语言阶段所学习的scanf十分的像,都是以遇到空格和回车或者换行停止读取

#include<iostream>
int main()
{int n = 0;char m = 0;std::cin >> n >> m;//向显示器输入整型n与字符m;std::cout << n << ' ' << m << std::endl;return 0;
}

在这里插入图片描述
当然我们不难发现,每次都要加上std::是十分麻烦的一件事情,因此我们在平常练习的时候可以展开这个命名空间,因此就可以不用刻意的加上这个代码了,using namespace std;//展开命名空间,相当于把指定域给放开了


缺省参数

C++中的缺省参数是指函数定义时给一些参数设置默认值,调用函数时可以不传入这些参数,系统会自动使用默认值。实例演示:

#include<iostream>
void Func(int a = 9)
{cout << a << endl;
}int main()
{Func();//在我们没有传参时,会使用默认的参数Func(10);//传参时用我们传递的参数
}

在这里插入图片描述

全缺省参数

全缺省参数,即函数的全部形参都设置为缺省参数

#include<iostream>
void Func(int a = 0, int b = 9, int c = 22)
{cout << a << ' ' << b << ' ' << c << ' ' << endl;
}int main()
{Func();return 0;
}

在这里插入图片描述


半缺省参数

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现,如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用哪个缺省值。故缺省参数只能在函数的定义中使用,而不能在函数的声明中使用。
  3. 缺省值必须是常量或者全局变量
  4. C语言不支持(编译器不支持)
#include<iostream>
void Func(int a, int b, int c = 22)
{cout << a << ' ' << b << ' ' << c << ' ' << endl;
}
int main()
{Func(10,99);return 0;
}

在这里插入图片描述


函数重载

在C++中,函数重载是指在同一个作用域中定义了多个具有相同名称但参数列表不同的函数。通过函数重载,可以使用相同的函数名实现不同的功能。

函数重载的特征包括:

  1. 函数名相同,参数列表不同,包括参数的类型、个数或顺序不同。
  2. 返回类型不是函数重载的标准,只有参数列表不同才算是重载。

函数重载可以提高程序的可读性和灵活性,使函数名更加直观,同时减少了记忆多个函数名的负担。


参数类型不同

函数重载可以通过相同的函数名不同类型的参数达到通过一个函数名实现不同的效果

#include<iostream>
int Add(int x, int y)
{return x + y;
}double Add(double x, double y)
{return x + y;
}
int main()
{cout << Add(4, 5) << endl;cout << Add(2.5, 5.2) << endl;return 0;
}`在这里插入代码片`

在这里插入图片描述


参数个数不同

同理函数重载可以通过相同的函数名不同个数的参数达到通过一个函数名实现不同的效果

void func(int a)
{cout << a << endl;
}void func(int a, int b, int c =3)
{cout << a + b + c << endl;
}int main()
{func(1);func(4, 5);return 0;
}

在这里插入图片描述


参数类型顺序不同

同理函数重载可以通过相同的函数参数顺序的不同达到通过一个函数名实现不同的效果

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;
}int main()
{f(10, 'a');f('a', 10);return 0;
}

在这里插入图片描述


好啦,今天的内容就到这里啦,下期内容预告“引用”,“内联函数”,“auto关键字”等等


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🌏🗺️ 这里祝各位寒假愉快 💞💞

相关文章:

【C++】入门基础

前言&#xff1a;C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;因此从今天开始们将进入&#xff23;的学习。 &#x1f496; 博主CSDN主页:…...

Nginx与keepalived实现集群

提醒一下&#xff1a;下面实例讲解是在mac虚拟机里的Ubuntu系统演示的&#xff1b; Nginx与keepalived实现集群实现的效果 两台服务器都安装Nginx与keepalived&#xff1a; master服务器的ip(192.168.200.2) backup服务器的ip(192.168.200.4) 将 master服务器Nginx与keepalive…...

初识MQRabbitMQ快速入门

一、同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你却不能…...

javaMailSender 发送邮件,基于Spring Boot

目录 引入依赖 配置文件配置 具体代码 MultipartFile 转 File 工具类 引入依赖 <!--邮件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!--日…...

【汇总】解决Spring-Web与Spring-WebFlux冲突

【汇总】解决Spring-Web与Spring-WebFlux冲突 问题发现问题解决问题一&#xff1a;The bean requestMappingHandlerMapping, defined in class path resource [org/springframework/web/reactive/config/DelegatingWebFluxConfiguration.class],问题二&#xff1a;The Java/XML…...

maven 依赖配置补充

依赖配置补充 依赖范围 import 管理依赖最基本的办法是继承父工程&#xff0c;但是和 Java 类一样&#xff0c;Maven 也是单继承的。如果不同体系的依赖信息封装在不同 POM 中了&#xff0c;没办法继承多个父工程怎么办&#xff1f;这时就可以使用 import 依赖范围。 典型案…...

Pandas ------ 向 Excel 文件中写入含有合并表头的数据

Pandas ------ 向 Excel 文件中写入含有合并表头的数据 推荐阅读引言正文 推荐阅读 Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据 引言 这里给大家介绍一下如何向 Excel 中写入带有合并表头的数据。 正文 import pandas as pddf1 pd.D…...

kafka summary

最近整体梳理之前用到的一些东西&#xff0c;回顾Kafka的时候好多东西都忘记了&#xff0c;把一些自己记的比较模糊并且感觉有用的东西整理一遍并且记忆一遍&#xff0c;仅用于记录以备后续回顾 Kafka的哪些场景中使用了零拷贝 生产者发送消息&#xff1a;在 Kafka 生产者发送…...

【新书推荐】2.6节 原码、反码和补码

回顾上一节中&#xff0c;我们讲解了整数的编码规则。 无符号整数编码规则&#xff1a;无符号整数全部都是正数&#xff0c;是什么就存什么。 有符号整数编码规则&#xff1a;有符号整数最高有效位为0是正数&#xff0c;最高有效位为1是负数。 本节内容&#xff1a;原码、反…...

docker 网络及如何资源(CPU/内存/磁盘)控制

安装Docker时&#xff0c;它会自动创建三个网络&#xff0c;bridge&#xff08;创建容器默认连接到此网络&#xff09;、 none 、host docker网络模式 Host 容器与宿主机共享网络namespace&#xff0c;即容器和宿主机使用同一个IP、端口范围&#xff08;容器与宿主机或其他使…...

安装 nvm

前言&#xff1a; nvm 即 node 版本管理工具 (node version manager)&#xff0c;好处是方便切换 node.js 版本。 通过将多个 node 版本安装在指定路径&#xff0c;然后通过 nvm 命令切换时&#xff0c;就会切换我们环境变量中 node 命令指定的实际执行的软件路径。 使用场景…...

Redis解决方案:NOAUTH Authentication required(连接jedis绑定密码或修改redis密码)

Redis解决方案&#xff1a;NOAUTH Authentication required&#xff08;连接jedis绑定密码或修改redis密码&#xff09; Java使用jedis连接redis时出现错误NOAUTH Authentication required 一、问题报错和原因 本地设置了redis的密码&#xff0c;但在远程连接时并没有输入密…...

多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效…...

如何实现无公网IP实现远程访问MongoDB文件数据库

&#x1f4d1;前言 本文主要是如何实现无公网IP实现远程访问MongoDB文件数据库的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x…...

华为防火墙USG6000V1的NAT实验

实验拓扑&#xff1a; 之前实验做过&#xff0c;可以翻找之前的博客&#xff0c;各设备ip和接口已配好&#xff0c;均可可ping通防火墙。 实验要求&#xff1a; 一.生产区在工作时间内可以访问dmz区域&#xff0c;仅可以访问http服务器。 二.办公区全天可以访问dmz区域&…...

spark-flink设计思想之吸星大法-1

Spark和Flink都是大数据处理框架&#xff0c;它们的设计思想有一些不同之处。以下是对它们设计思想的简要对比&#xff1a; 数据模型和计算模型&#xff1a; Spark&#xff1a;Spark使用弹性分布式数据集&#xff08;RDD&#xff09;作为其核心数据结构。RDD是只读的、不可变的…...

力扣1312. 让字符串成为回文串的最少插入次数

动态规划 思路&#xff1a; 通过插入字符构造回文串&#xff0c;要想插入次数最少&#xff0c;可以将字符串 s 的逆序 s 进行比较找出最长公共子序列&#xff1b;可以先分析&#xff0c;字符串 s 通过插入得到回文串 ps&#xff0c;其中间的字符应该不会变化&#xff1a; 若 s…...

qemu的安装

1、简介 QEMU&#xff08;Quick EMUlator&#xff09;是一个开源的处理器模拟器&#xff0c;它可以在一种硬件平台上模拟另一种硬件平台&#xff0c;从而运行各种不同的操作系统。QEMU通过动态二进制翻译来实现高性能的模拟&#xff0c;这使得它可以在接近原生性能的速度下运行…...

myql入门

目录 安装修改密码学习资料个人git仓库文章视频官网 安装 #移除以前的mysql相关 sudo apt remove --purge mysql-\* #安装mysql sudo apt install mysql-server mysql-client #查看是否启动 systemctl status mysql #手动启动 systemctl start mysql #查看mysql版本 mysql --v…...

前端开发有没有必要转鸿蒙开发?

前端开发有没有必要转鸿蒙开发&#xff1f;如果后面的工作中有参与鸿蒙开发的机会&#xff0c;那肯定是转呀&#xff01;毕竟多接触一些技能也不会有什么坏处。 我想说的是&#xff1a;鸿蒙替代不了前端&#xff0c;如果你目前正在从事前端开发&#xff0c;那么你完全可以将鸿蒙…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...