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

【c++】基础知识——快速入门c++

🌟🌟作者主页:ephemerals__

🌟🌟所属专栏:C++

目录

前言

一、手搓一个Hello World

二、命名空间namespace

1.命名空间的定义

2.命名空间的使用

3.命名空间补充知识

三、c++中的输入和输出

四、缺省参数

五、函数重载

六、内联函数

七、空指针

总结


前言

        c++是在c语言的基础上,增加了面向对象编程、引用、函数重载、模板库STL等新特性,使得c++成为一门功能强大、灵活多变的语言。c++在语法上兼容大部分c语言,因而学习了c语言之后,会对c++学习有一定的帮助。相比java,c++语法的学习难度较高,但是它难学易用,也有利于我们理解底层,是一门十分值得深入学习的语言。

        接下来我们会重点介绍一些c++的前置基础知识,便于我们快速入门c++语法。

一、手搓一个Hello World

        那么就让我们从HelloWorld开始,进入c++的知识海洋。代码如下:

//c语言版本
#include <stdio.h>int main()
{printf("Hello World\n");return 0;
}
//c++版本
#include <iostream>
using namespace std;int main()
{cout << "Hello World" << endl;return 0;
}

由于c++兼容c语言语法,所以这两段代码在c++编译器中都是可以完成运行的。

运行结果:

可以看到,c++的基本语法和c语言还是有较大区别的。看不懂没关系,我们将会逐一讲解这里的细节。

二、命名空间namespace

        在c++当中,由于变量、函数、类等数量庞大,难免会出现重名的情况,它们都存在与全局域当中,使用时就会出现冲突。而命名空间的出现就解决了这个问题。命名空间会对标识符的名称进行本地化,本质上是使它们位于不同的作用域中,避免了冲突的情况

        接下来我们尝试定义命名空间。

1.命名空间的定义

        举个例子:

namespace xxx
{int x = 5;int func(int a){return a * a;}struct A{int m;char n;};
}

1.定义命名空间使用的关键字是namespace,后面加上该空间的名字,在之后的 { } 中定义变量、函数或类等等。

2.命名空间只能定义在全局,不能定义在函数体或者类中。

3.命名空间可以嵌套定义

4.一个项目的多文件中定义的同名命名空间,编译器会认为是同一个命名空间,不会发生冲突。

2.命名空间的使用

        接下来,我们尝试访问命名空间中的成员。

namespace xxx
{int x = 5;int func(int a){return a * a;}struct A{int m;char n;};
}int main()
{int x = 10;printf("%d\n", x + xxx::x);//访问命名空间的成员时,在空间名之后加上两个冒号,称之为域限定操作符printf("%d\n", xxx::func(x));return 0;
}

运行结果:

        使用using关键字还可以将命名空间或者其成员展开。举例:

namespace a
{int m = 5;int n = 3;
}namespace b
{int p = 10;int q = 20;
}using namespace a;//展开整个命名空间
using b::p;//展开命名空间的某成员int main()
{printf("m=%d,n=%d\n", m, n);printf("p=%d,q=%d\n", p, b::q);return 0;
}

 运行结果:

可以看到,展开命名空间或者成员之后,在访问时就不需要再加上“::”了。这里需要注意:在大型项目当中尽量不要展开命名空间,很容易发生冲突的情况,日常练习时为了方便可以使用。

        我们之前的HelloWorld代码中,使用了语句“using namespace std;”展开了命名空间std

3.命名空间补充知识

1.c++标准库都放在叫做“std”的命名空间当中。

2.namespace本质上就是定义了一个,叫做命名空间域

3.c++中有四种函数局部域、全局域、命名空间域、类域不同的域当中的相同变量或者函数名形成域隔离,不会冲突函数局部域和全局域会影响变量的声明周期,命名空间域和类域不会影响变量声明周期

三、c++中的输入和输出

        接下来,我们按照刚才写的HelloWorld程序介绍c++的输入输出。

#include <iostream>
using namespace std;int main()
{cout << "Hello World" << endl;return 0;
}

1.可以看到,我们引入了头文件"iostream",它是c++的标准输入、输出流库,定义了标准的输入输出对象。

2.cout,也就是std::cout是类ostream的对象,它主要面向窄字符的标准输出流,与c语言中printf函数作用相似,与printf不同的是,它可以自动识别要输出的变量的类型,在使用时不需要特别指定输出类型

3.endl:是一个函数,它用于输出一个换行符,与传统的输出“\n”不同的是,它可以在各种操作系统下正常使用,而“\n”在不同的操作系统中含义可能不同

4.我们看到,“Hello World”字符串被两个“<<”符号围了起来,这个符号叫做“流插入操作符”,它可以理解为将该操作符之后的内容插入到"cout"中便于输出。当我们需要输出多个变量时,可以将这些变量全部用“<<”分隔开。

对于输入操作,c++提供了"std::cin",它是类istream的对象,主要面向窄字符的标准输入流。在使用它时,我们需要加上“>>”(流提取操作符),可以理解为将输入的值提取到变量当中。

接下来我们写一段代码测试c++中的输入输出:

#include <iostream>
using namespace std;int main()
{int a = 3;float b = 5.5f;char c = 'w';cout << a << ' ' << b << ' ' << c << endl;//不同的内容之间必须用<<分割int d = 0;cin >> d;cout << d;return 0;
}

运行结果:

四、缺省参数

        缺省参数(默认参数),指的是在声明或者定义函数时,可以给函数的参数设置一个默认值当调用该函数时,如果没有传对应参数,则使用该默认值;否则使用传入的参数

1.缺省参数可分为全缺省参数半缺省参数,全缺省参数指的就是函数的参数全部设置了默认值,半缺省参数指的就是部分参数设置了默认值。C++标准规定:半缺省参数默认值的设置必须按照函数参数从右往左进行,不能跳跃。代码示例:

#include <iostream>
using namespace std;void func1(int a = 3)//全缺省参数
{cout << a << endl;
}void func2(int a, int b = 0)//半缺省参数
{cout << a + b << endl;
}int main()
{func1();func1(1);func2(1);func2(1, 2);return 0;
}

运行结果:

以下情况运行就会报错:

#include <iostream>
using namespace std;void func3(int a = 10, int b)//缺省参数只能从右往左设置
{cout << a + b << endl;
}int main()
{func3(3, 5);return 0;
}

2.调用带缺省参数的函数时,实参的传入必须从左到右进行,不能跳跃。代码示例:

#include <iostream>
using namespace std;void func(int a, int b = 3, int c = 5)
{cout << a + b + c << endl;
}int main()
{func(1, , 1);//报错return 0;
}

3.当函数的声明和定义分离时,缺省参数不能同时出现在声明和定义当中,必须在声明中设置缺省参数。

五、函数重载

        c++中,当同一作用域中出现同名函数时,如果这些函数的形参不同(参数个数不同或者参数类型有不同),就会出现函数重载,这些函数之间不会发生冲突情况。相比c语言,c++中函数重载的出现,体现了多态性,使得函数使用更加灵活。

举个例子:

#include <iostream>
using namespace std;int add(int a, int b)//两函数的参数类型不同,出现重载
{return a + b;
}double add(double a, double b)//两函数的参数类型不同,出现重载
{return a + b;
}int main()
{cout << add(1, 2) << endl;cout << add(3.3, 5.5) << endl;return 0;
}

运行结果:

可以看到,编译器会根据我们调用函数时传入的参数类型,来决定调用哪一个重载函数

下面来看一个特殊情况

void func()
{cout << 1 << endl;
}void func(int a = 10)
{cout << 2 << endl;
}int main()
{func();//报错
}

两个func函数构成函数重载,但是当调用函数时不传参,就会出现歧义,编译器无法确定我们调用的是哪一个函数

六、内联函数

        相比c语言,c++引入了“内联函数”这个概念,它对程序的效率提升有一定帮助。接下来我们深入了解以下内联函数。

1.用关键字“inline”修饰的函数叫做内联函数,在程序编译的过程中,编译器会在调用该函数的地方将此函数展开,这样在程序运行时就不会创建函数栈帧,提高了效率

2.由于函数的体量有别,所以并不是所有用“inline”修饰的函数都会在编译时展开,使用“inline”修饰只是程序员的建议,最终是否展开由编译器决定。一般代码量较短的函数会被展开,而代码量较大或者递归函数就不会被展开,展开之后反而会增加程序冗余。

3.当一个函数被我们使用“inline”修饰时,如果该函数的声明和定义是分离的,那么将会导致编译错误所以使用“inline”修饰函数时要同时进行声明和定义

七、空指针

        在c语言中,空指针用“NULL”来表示,它是一个宏常量,是被强制类型转换为void型指针的0;而c++中的“NULL”直接替换为0。由于c++中存在函数重载,当我们将NULL作为参数传递时,可能会出现以下情况

#include <iostream>
using namespace std;void func(int* ptr)
{cout << 1 << endl;
}void func(int x)
{cout << 2 << endl;
}int main()
{func(NULL);return 0;
}

运行结果:

我们传入空指针,本意是要调用第一个函数,但是结果却调用了第二个函数。如果我们传入被强制转换为void*的0呢

可以看到,程序出现了报错,我们仍然无法调用第一个函数。针对这种问题,c++定义了一个关键字来表示空指针nullptr。它是一种特殊类型的字面量,可以转换为任意类型的指针。由于它只能被转换为指针类型,所以就避免了以上问题。我们来传入nullptr试试:

#include <iostream>
using namespace std;void func(int* ptr)
{cout << 1 << endl;
}void func(int x)
{cout << 2 << endl;
}int main()
{func(nullptr);return 0;
}

运行结果:

可以看到,程序成功地调用了第一个函数。

总结

        今天我们学习了关于c++的一些前置知识,这些新的概念和定义有效地弥补了c语言的一些不足。之后我们的c++程序都会以这些知识为基础。如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤

相关文章:

【c++】基础知识——快速入门c++

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、手搓一个Hello World 二、命名空间namespace 1.命名空间的定义 2.命名空间的使用 3.命名空间补充知识 三、c中的输入和输出 四、缺省参…...

AI学习记录 - 自注意力机制的计算流程图

过段时间解释一下&#xff0c;为啥这样子计算&#xff0c;研究这个自注意力花了不少时间&#xff0c;网上很多讲概念&#xff0c;但是没有具体的流程图和计算方式总结…...

JavaScript快速入门,满满干货总结,快速掌握JS语法,DOM,BOM,事件

目录 一. JavaScript、HTML、CSS简介 1.1 HTML简介和举例说明 1.2 CSS简介和举例说明 1.3 JavaScript 简介和举例说明 二. JavaScript 基本语法 2.1 变量类型和定义方式 2.2 逻辑运算符&#xff0c;比较运算符 2.3 流程控制&#xff0c;if&#xff0c;if...else...&…...

【C++】C++入门基础【类与对象】

目录 1.类 1.1类的定义 1.2struct 与 class对比 2.访问限定符 3. 类域 4.实例化 5.存储大小----内存对齐 6.this指针 1.类 1.1类的定义 class作为类的关键字&#xff0c;后面跟的是类的名字&#xff0c;如Stack&#xff0c;{}中的为类的主体&#xff0c;类定义结束时…...

Qt | QScatterSeries 散点图

点击上方"蓝字"关注我们 01、QScatterSeries QScatterSeries 的类,它将代表散点图中的一个系列。这个类将包含数据点、颜色和样式等属性,以及用于绘制散点图的方法。 02、main.cpp #include <QtWidgets/QApplication>#include <QtWidgets/QMainWindow…...

无缝协作的艺术:Codigger 视频会议(Meeting)的用户体验

在当今数字化的时代&#xff0c;远程协作已经成为工作和学习中不可或缺的一部分。然而&#xff0c;远程协作也面临着诸多挑战&#xff0c;如沟通不畅、信息同步不及时、协作工具的复杂性等。而 Codigger 视频会议&#xff08;Meeting&#xff09;作为一款创新的工具&#xff0c…...

C基础练习(学生管理系统)

1.系统运行&#xff0c;打开如下界面。列出系统帮助菜单&#xff08;即命令菜单&#xff09;&#xff0c;提示输入命令 2.开始时还没有录入成绩&#xff0c;所以输入命令 L 也无法列出成绩。应提示“成绩表为空&#xff01;请先使用命令 T 录入学生成绩。” 同理&#xff0c;当…...

网络安全抓包封包WEB

目录 1.抓包 1. 网络故障排除 应用 意义 2. 网络安全监控 应用 意义 3. 性能优化 应用 意义 4. 协议分析与开发 应用 意义 5. 数据分析与合规性审计 应用 意义 抓包工具 总结 2.抓包的应用对象 1. 网络设备 路由器和交换机 防火墙和入侵检测系统&#xff…...

Spring Boot - 在Spring Boot中实现灵活的API版本控制(上)

文章目录 为什么需要多版本管理&#xff1f;在Spring Boot中实现多版本API的常用方法1. URL路径中包含版本号2. 请求头中包含版本号3. 自定义注解和拦截器 注意事项 为什么需要多版本管理&#xff1f; API接口的多版本管理在我们日常的开发中很重要&#xff0c;特别是当API需要…...

普中51单片机:DS18B20温度传感器操作指南(十三)

文章目录 引言电路图引脚讲解初始化时序写时序读时序温度变换温度读取完整代码 引言 DS18B20是一款单总线接口的数字温度传感器&#xff0c;仅需一个IO口即可实现数据通信。这里只对如何简单操作开发板的DS1802进行讲解&#xff0c;关于DS18B20温度传感器的详细操作原理&#…...

【网络】网络的发展历程及其相关概念

1.什么是网络 计算机网络是指将一群具有独立功能的计算机通过通信设备以及传输媒体被互联起来的&#xff0c;在通信软件的支持下&#xff0c;实现计算机间资源共享、信息交换或协同工作的系统。计算机网络是计算机技术与通信技术紧密结合的产物&#xff0c;两者的迅速发展渗透形…...

鸿蒙HarmonyOS开发:如何使用第三方库,加速应用开发

文章目录 一、如何安装 ohpm-cli二、如何安装三方库1、在 oh-package.json5 文件中声明三方库&#xff0c;以 ohos/crypto-js 为例&#xff1a;2、安装指定名称 pacakge_name 的三方库&#xff0c;执行以下命令&#xff0c;将自动在当前目录下的 oh-package.json5 文件中自动添…...

C++的标准模板库简单介绍

C的标准模板库&#xff08;STL, Standard Template Library&#xff09;是一个强大的工具&#xff0c;旨在提供高效和灵活的数据结构和算法。STL的设计目的是使C程序更加通用和可重用。以下是对STL的详细介绍&#xff1a; 1. STL的组成部分 STL主要由以下几部分组成&#xff…...

安卓常用控件ListView

文章目录 ListView的常用属性ListView的常用APIListView的简单使用 ListView是一个列表样式的 ViewGroup&#xff0c;将若干 item 按行排列。它是一个很基本的控件也是 Android 中最重要的控件之一。它可以实现多个 View 的垂直排列并支持滚动显示效果。 ListView的常用属性 常…...

优秀的行为验证码的应用场景与行业案例

应用场景 登录注册 &#xff1a; 验证码适用于App、Web及小程序等用户注册场景&#xff0c;可以抵御自动机恶意注册&#xff0c;垃圾注册、抵御撞库登录、暴力破解、验证账号敏感信息的修改&#xff0c;同时可以有效阻止撞库攻击&#xff0c;从源头进行防护&#xff0c;保障正…...

《程序猿入职必会(10) · SpringBoot3 整合 MyBatis-Plus》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

计算机网络408考研 2018

1 计算机网络408考研2018年真题解析_哔哩哔哩_bilibili...

(亲测有效)SpringBoot+Vue项目云服务器部署(宝塔)

目录 一、准备工作 1、购买云服务器 2、获取面板地址 二、jdk和数据库 1、安装环境 2、安装Java环境jdk 3、添加数据库 三、前端部署 1、修改后台服务所在源 2、vue build 2、创建站点 四、后端部署 1、修改application.yml 2、idea打包 3、运行jar包 方式一&a…...

健康管理系统

目录 第1章 系统概述 第2章 可行性研究 2.1 项目背景及意义 2.2 可行性研究 第3章 需求分析 3.1 功能性需求 3.2 非功能性需求 3.2.1 性能需求 第4章 总体设计 4.1 技术架构 4.2功能模块设计 第5章 详细设计 5.1 主页 5.2 写剧本杀 5.3 剧本杀分类管理 5.4 个人…...

【计算机网络】网络基础概念

计算机网络发展 独立模式&#xff1a;最开始计算机之间相互独立&#xff0c;每个终端各自持有数据。 网络互联&#xff1a;多台计算机连接在一起&#xff0c;完成数据共享。 局域网 LAN&#xff1a;计算机数量增多&#xff0c;通过交换机和路由器连接在一起。 广域网 WAN: 将远…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...