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

C++篇:C++入门基础(1)

C++前言:

        C++ 的发展历史可以追溯到1979年,当时C语言以其效率和灵活性成为广泛使用的系统编程语言,但它也有一些限制,例如缺乏直接支持面向对象编程(OOP)的特性。

        之后Bjarne Stroustrup(也就是C++之父)是C++的创始人和主要设计者。他在1980年代初期在贝尔实验室工作时,开始思考如何扩展C语言,使其能够更好地支持OOP和其他现代编程方法。他最初称这个扩展为“C with Classes”(带类的C语言),这是一个在C语言基础上添加了类、继承、成员函数等概念的版本。

        1983年,Bjarne Stroustrup正式将其改进的语言命名为C++,这个名称代表“增强的C”(C增强版)。C++在语法和语义上保留了C语言的大部分特性,同时引入了面向对象编程的特性,如类、封装、继承和多态性,使得程序员能够更方便地进行复杂系统的设计和实现。

                                

第一个C++语言:

        因为C++是在c的基础上延伸出来的语言,所以C++兼容c的大部分语法,也可以在c++的编辑器上编辑c语言的代码。

        由上图可以看出文件后缀是以.cpp结尾表示这是一个C++编程语言源代码文件,而任然可以编写C语言的代码。

        C++有⼀套⾃⼰的输⼊输出,严格说C++版本的hello world其实是这样写的,这里代码看不懂没关系,后续小编会进行讲解。

C++的命名空间

        1.namespace(命名空间)的概念

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

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

                 

        如上图就定义了一个名为cat的命名空间,同学们也可以用自己名字或者其他的名字进行命名,而在命名空间里存放着类型为int的rand变量。

        namespace只能定义在全局,不能再局部进行定义。
        
        namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,这个小编之后会进行介绍。
       
        为了观察namespace的使用,小编以下是用C写的一段代码:

        上图代码,小编创建了一个int类型的全局变量rand,并在主函数里尝试输出rand,此时可以看出函数在编译的时候就进行了报错,给出的理由是rand重定义,表明rand在这里是一个函数,而自己又给rand定义成了一个int类型的全局变量,那么在c++的编译是时候是不会通过的。那么如果就想用rand名字来创建变量应该怎么做呢?

        从上图可以看到,在使用namespace里进行定义rand并再主函数里成功的输出了它,此时的变量rand与函数rand就进行了隔离,输出时输出的是命名空间里rand变量。

                关于局部域、全局域以及命名空间域

        从namespace的定义中可以得知,namespace属于独立的一个域,与局部域,全局域都不相同。

        在上图代码中,创建了三个类型相同且变量名相同的变量,而在编译的时候没用发生报错,这是因为三个变量都处在不同的域当中。

        

        

        命名空间域就类似于一堵墙,它把变量a进行了隔离名字冲突就解决了,只有申请访问的时候才会查找到它。

                域作用限定符

                ': :':表示域作用限定符,它的作用是指示在命名空间、类、结构体或枚举类型中的特定成员的访问。

        

        第一句 printf里并没有加': :'符号,表示在局部域main函数里查找的变量。

        第二句 printf里在': :'前面没加东西,表示是在全局域里查找的变量。

        第三局 printf里再': :'前加了名为cat的命名空间,表示在命名空间cat里查找的变量。

                命名空间的嵌套

        在命名空间里同样也可以嵌套命名别的命名空间。假设张三和李四在同一个的项目里工作,那么如果张三和李四刚好在同一个命名空间里定义了相同的变量。

        那么此时命名又冲突,总不能让张三和李四打一架来决定出谁才可以命名的变量。这时候命名嵌套就起到了作用。

        此时编译也通过了,张三就用张三自己的命名空间,李四就用李四的命名空间,这样谁也不会起冲突。

                多个同名的命名空间合并

        在Stack.h文件里创建了名为cat的命名空间,空间里包含着栈的声明。

在Stack.cpp的文件里同样使用了名为cat的命名空间,并对栈的函数进行定义。

        在主文件里,我们我们用cat命名空间里的栈类型申请了一个变量,并使用栈初始化函数进行初始化,可以看出程序编译成功说明了在不同的文件中可以使用相同名字的命名空间,类似于将两个cat的命名空间进行了合并成为一个cat的命名空间。 这种不同于结构体,如果两个结构体使用相同的名字则会报错类型重定义。

        在住文件里也同样定义了一个栈的声明并使用它,同样没有进行报错,说明了命名空间可以将变量进行很好的区分。

        2.命名空间的使用

        编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以我们要使⽤命名空间中定义的变量/函数则有以下三种方式
                指定命名空间

        指定命名空间也就是编译器直接去指定的命名空间里找,不会再去别的地方搜索,可以有效的避免变量的混用,唯一的缺点就是每次使用都需要声明会略微麻烦。

                使用using将某个命名空间展开

        using主要用于声明命名空间、别名、模板类型和基类成员等方面。这里 using lisi::a;表示展开lisi命名空间里a变量。

        但如果在展开的同时又在全局域里又声明了同样变量,编译器就会进行报错,说a重定义。原因是因为using的展开相当于在全剧域中暴露了命名空间里的变量,也就是说这两个a同时存在于全局域当中。

        相当于给命名空间域开了一扇窗户,是的全局域里也能找到a。

                展开全部命名空间

        代码using namespace lisi;表示将lisi空间的内容全部展开到全局域中,不推荐使用冲突⻛险很⼤。

C++的输入输出IO流:

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

        std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输⼊流,类似于C语言的scanf函数。

        std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流,类似C语言的printf函数。

        std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区,相当于C语言的换行符‘\n’;

        <<是流插⼊运算符,>>是流提取运算符。

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

                       由上图代码可见,定义了三个类型不同的变量,并使用cin进行输入,可以看到cin能够智能识别变量类型,并不需要再去像C语言那样手动确定变量类型的输入模式。接着通过cout进行输出,并且每一小段输出内容后都跟了endl进行换行刷新。

C++缺省参数

        缺省参数的概念:

        在C++中,缺省参数(默认参数)是指在定义函数时为参数提供一个默认值。这个默认值可以在调用函数时省略相应的参数,如果不给此函数进行传参则编译器会调用默认值。这种功能使得函数在不同的调用情境中可以有不同的行为,同时简化了函数的调用方式。缺省参数同时又分为全缺省与半缺省。而在C语言中是不支持缺省参数。

        全缺省与半缺省

                全缺省:

        

        全缺省就表示,在使用函数的时候全部不进行传参,使用的都是函数的默认值(缺省值)。如上图,在函数Add中定义了三个形参a,b,c。并且都给形参进行了赋值操作。而在主函数进行Add的调用时并没有进行传参的操作,而是直接使用并接受了Add函数的返回值,可以看到sum值最终接受的参数就是a,b,c的默认值进行相加返回的值。

                半缺省:

        半缺省就表示只给部分形参赋缺省值,如上图代码我只给形参c赋了缺省值,而a,b使用了指定参数进行传参。

        带缺省参数的调用的注意事项

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

        

        如上图,c没有进行缺省,传参只传了一个实参,那么这个实参将会赋值给a,而c并被赋值到,编译进行了报错。

        2.缺省参数的声明和定义不能同时给,并且也不能只在定义的时候给。

        

        如上图,分别在函数声明与定义的两个文件里都将形参n进行了缺省,编译器在编译时也进行了报错说重定义参数。

        如果只在定义的时候给参数进行缺省而声明的时候不给缺省,那么编译也有可能不会过。        

C++函数重载

        函数重载的概念:

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同,通俗的来说,函数重载就类似于,有很多个同名同姓的人,但每个人都是不同的个体。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的。

        函数重载的分类

                参数类型顺序不同:

        

        上图定义了两个同样的Add名称的函数,而两个函数的参数的类型顺序不同那么这两个函数就支持函数重载。

                参数类型不同:

        上图定义了两个同样的Add名称的函数,而两个函数的参数类型不同那么这两个函数同样支持函数重载。

                参数个数不同:

            上图定义了两个同样的Add名称的函数,而两个函数里的参数虽然相同但参数的个数不同那么这两个函数同样支持函数重载。

        函数的重载与函数的返回类型无关:

        当两个相同命名、相同参数的函数只是返回类型不同时进行编译,程序进行了报错,说明只有返回类型不同的函数是不支持函数重载的。

相关文章:

C++篇:C++入门基础(1)

C前言&#xff1a; C 的发展历史可以追溯到1979年&#xff0c;当时C语言以其效率和灵活性成为广泛使用的系统编程语言&#xff0c;但它也有一些限制&#xff0c;例如缺乏直接支持面向对象编程&#xff08;OOP&#xff09;的特性。 之后Bjarne Stroustrup(也就是C之父)是C的创始…...

【Linux】网络编程_3

文章目录 十、网络基础5. socket编程socket 常见APIsockaddr结构简单的UDP网络程序 未完待续 十、网络基础 5. socket编程 socket 常见API // 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器) int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服…...

Kafka设计与原理详解

RocketMQ 是一款开源的分布式消息系统&#xff0c;基于高可用分布式集群技术&#xff0c;提供低延时的、高可靠的消息发布与订阅服务。同时&#xff0c;广泛应用于多个领域&#xff0c;包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即…...

IPV6公网暴露下的OPENWRT防火墙安全设置(只允许访问局域网中指定服务器指定端口其余拒绝)

首先是防火墙的常规配置和区域配置 标的有点乱但是选项含义都做了解释&#xff0c;看不懂可以直接按图抄作业。 其次是对需要访问的端口做访问放通 情况1 DDNS位于openwrt网关上&#xff0c;外网访问openwrt&#xff0c;通过端口转发访问内部服务器。此情况需要设置端口转发。 …...

单调栈② | Java | LeetCode 接雨水 最大的矩形

42. 接雨水 暴力法 for循环遍历每一个柱子&#xff0c;内层for循环找到左边和右边比它高的柱子 时间复杂度 n^2 优化&#xff1a;添加一个预处理 定义一个数组&#xff0c;存放该柱子右边比他高的柱子是哪一个 再用一个数组&#xff0c;存放该柱子左边比他高的柱子是哪一个 …...

2024年全国青少年信息素养大赛总决赛日赛程表

2024全国青少年信息素养大赛赛程表分赛场&#xff08;浙江传媒学院桐乡校区、桐乡技师学院&#xff09;日期地点时间赛项16日传媒学院8:00-9:00检录 9:00-10:30开赛图形化编程挑战赛&#xff08;小学1-3年级&#xff09;A组12:00-13:00检录 13:00-14:30开赛图形化编程挑战赛&am…...

PHP:连接钉钉接口-钉钉回调事件,本地测试数据

前置数据参考 数据说明&#xff1a;参见官方文档回调事件消息体加解密 - 钉钉开放平台 (dingtalk.com) URL后面带的参数&#xff1a; signature5a65ceeef9aab2d149439f82dc191dd6c5cbe2c0&timestamp1445827045067&noncenEXhMP4r Post参数&#xff1a; { &quo…...

【C++标准模版库】vector的介绍及使用

vector 一.vector的介绍二.vector的使用1.vector 构造函数2.vector 空间增长3.vector 增删查改4.vector 迭代器的使用1.正向迭代器2.反向迭代器 5.victor 迭代器失效问题&#xff08;重点&#xff09; 三.vector不支持 流提取与流插入四.vector存储自定义类型1.存储string2.存储…...

数说故事|引爆社媒的森贝儿IP,品牌如何实现流量变现?

以可爱、雅痞、贱萌......的外表加魔性舞姿出圈的可爱小狗——森贝儿贵宾犬Milo&#xff0c;用“可爱微怒”的表情演绎着当代打工人的“疯态”&#xff0c;并迅速晋升成不少打工人高频使用的表情包。 最近几年&#xff0c;“萌系”爆款IP频出&#xff0c;用小动物的形象、可爱…...

使用openpyxl库对Excel条件格式的深度探索

哈喽,大家好,我是木头左! openpyxl中的条件格式 在openpyxl中,可以使用ConditionalFormatting类来创建和管理条件格式。这个类有两个主要的方法:add_conditional_formatting()和remove_conditional_formatting(),分别用于添加和删除条件格式。 add_conditional_formatt…...

原生javascript中的ajax通信技术

AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。也就是实现前后端交互的功能。以下是使用AJAX的基本步骤和代码演示&#xff1a; 1.创建一个XMLHttpRequest对象&#xff1a; var xhr…...

SpringBoot Vue用自签名证书SSL配置https,http转发到https(整理文章)

要配置https地址访问&#xff0c;需要向服务器商申请和使用SSL证书。由于是测试阶段&#xff0c;我们自己创建SSL证书&#xff0c;叫作自签名证书。 1.创建自签名证书 Vue前端生成自签名证书我们用openssl 参考文章一 参考文章二SpringBoot后端生成自签名证书用JDK自带的keyt…...

嵌入式人工智能(41-基于树莓派4B的串口蓝牙模块AT09-cc2541)

1、串口蓝牙模块AT-09 AT-09是一种串口蓝牙模块&#xff0c;可实现串口与蓝牙之间的数据传输。AT-09模块基于蓝牙4.0技术&#xff0c;具有低功耗、高传输速率和广泛的应用范围。 AT-09模块支持AT指令&#xff0c;通过串口与外部设备进行通信。用户可以使用AT指令对模块进行配…...

C++ 动态规划

子序列子串相关 单个指一个数组或字符串&#xff0c;两个指两个数组或字符串。 最长上升子序列-单个 dp[i]&#xff1a;以下标i为结尾的递增的最长子序列长度。 位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 1 的最大值。 class Solution { public:int l…...

回溯问题总结

一、子集问题 模板问题 给定一个序列[1,n],求这个序列的所有子集 输入描述&#xff1a; 一个正整数n(1 < n < 12) 输出描述&#xff1a; 每个子集一行&#xff0c;输出所有子集。 输出顺序为&#xff1a; &#xff08;1&#xff09;元素个数少的子集优先输出&#xff1b;…...

GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库

使用GraphRAG踩坑无数 在GraphRAG的使用过程中将需要踩的坑都踩了一遍&#xff08;不得不吐槽下&#xff0c;官方代码有很多遗留问题&#xff0c;他们自己也承认工作重心在算法的优化而不是各种模型和框架的兼容性适配性上&#xff09;&#xff0c;经过了大量的查阅各种资料以…...

.net # 检查 带有pdf xss

1.解决pdf含javasprct脚本动作&#xff0c;这里是验证pdf内部事件。相关pdf文件下载&#xff1a; 测试pdf文件 相关包 iTextSharp 5.5.13.4 iTextSharp using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser;private Boolean IsPdfSafe(Stream stream){// PdfReader…...

【React】探讨className的正确使用方式

文章目录 一、className的正确用法二、常见错误解析三、实例解析四、错误分析与解决五、注意事项六、总结 在React开发中&#xff0c;正确使用className属性对组件进行样式设置至关重要。然而&#xff0c;由于JavaScript和JSX的特殊性&#xff0c;开发者常常会犯一些小错误&…...

打靶记录5——靶机hard_socnet2

靶机&#xff1a; https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova目标&#xff1a; 取得root权限 涉及攻击方法 主机发现端口扫描SQL注入文件上传蚁剑上线XMLRPC命令执行逆向工程动态调试漏洞利用代码编写 方法 CVE-2021-3493缓冲器溢出漏洞 学习目标 …...

独立站+TikTok达人:自主营销与创意内容的完美结合

在全球电商市场迅猛发展的今天&#xff0c;独立站和TikTok达人的结合正在创造一种全新的电商营销模式。独立站作为电商平台&#xff0c;其自主性和灵活性为商家提供了广阔的发展空间&#xff1b;而TikTok达人凭借其独特的内容创作能力和庞大的粉丝基础&#xff0c;成为推动销售…...

【启明智显分享】适用于多功能养生壶、茶吧机的2.8寸触摸彩屏解决方案

健康生活理念不断深入人心&#xff0c;多功能养生壶、茶吧机等智能产品成为现代家庭的热门小家电。为推动智能家居个性化、多样化发展&#xff0c;启明智显推出了基于SC05 Plus 2.8寸触摸彩屏的多功能养生壶、茶吧机的解决方案&#xff0c;旨在提升养生壶与茶吧机的用户体验与操…...

WAF绕过技术(PKAV团队)

目录 主流WAF的绕过技术 Web容器的特性 1. IIS+ASP的神奇% 2. IIS的Unicode编码字符 3. HPP(HTTP Parameter Pollution): HTTP参数污染 4. 畸形HTTP请求 Web应用层的问题 1. 多重编码问题 2. 多数据来源的问题 WAF自身的问题 1. 白名单机制 2. 数据获取方式存在缺陷…...

『 Linux 』POSIX 信号量与基于环形队列的生产者消费者模型

文章目录 信号量概念POSIX 信号量基于环形队列的生产者消费者模型基于环形队列的生产者消费者模型编码实现基于环形队列的生产者消费者模型发送任务测试 信号量概念 信号量是一种用于多线程或多进程间同步的机制; 其定义是一个整形变量,本质上信号量可以看成是一个计数器,用来描…...

python中的字符串方法

python中的字符串 举个例子先 name = 貂蝉开大 #声明了一个字符串 print(name) # 打印了一个字符串 print(name[0:1] #输出貂蝉 print(name[2:3] #输出开大 扩展方法 find() # 查找字符串中某个字符的索引 index_ = name.find("貂") print(index_) # 输出 …...

python实现consul的服务注册与注销

我在使用consul的时候主要用于prometheus的consul服务发现&#xff0c;把数据库、虚拟机信息发布到consul&#xff0c;prometheus通过consul拿到数据库、虚拟机信息去采集指标信息。 此篇文章前提是已经安装好consul服务以后&#xff0c;安装consul请参考二进制方式部署consul…...

校园选课助手【2】-重要的登录模块

用户登录模块技术要点&#xff1a; 密码通过MD5加密传输分布式session存储用户登录信息自定义注解进行字段校验自定义拦截器完成登录验证 下面依次给出代码和详细解释&#xff1a; 1.使用 MD5 二次加密用户登录信息&#xff0c;前端先通过密码加上盐进行MD5加密交给服务器&a…...

4章2节:从排序到分组和筛选,通过 R 的 dplyr 扩展包来操作

dplyr是R语言中一个强大且高效的数据处理包,专门设计用于处理数据框(data frames)。它的语法简洁明了,操作高效,尤其适用于大数据集。dplyr提供了一系列函数,使得数据的筛选、变换、聚合和排序等操作变得简单直观。本文将详细介绍dplyr扩展包如何进行数据的排序到分组和筛…...

C语言实现 -- 单链表

C语言实现 -- 单链表 1.顺序表经典算法1.1 移除元素1.2 合并两个有序数组 2.顺序表的问题及思考3.链表3.1 链表的概念及结构3.2 单链表的实现 4.链表的分类 讲链表之前&#xff0c;我们先看两个顺序表经典算法。 1.顺序表经典算法 1.1 移除元素 经典算法OJ题1&#xff1a;移除…...

WSL和Windows建立TCP通信协议

1.windows配置 首先是windows端&#xff0c;启动TCP服务端&#xff0c;用来监听指定的端口号&#xff0c;其中IP地址可以设置为任意&#xff0c;否则服务器可能无法正常打开。 addrSer.sin_addr.S_un.S_addr INADDR_ANY; recv函数用来接收客户端传输的数据&#xff0c;其中…...

Android Gradle开发与应用(一):Gradle基础

文章目录 引言一、Gradle简介二、Gradle基础语法1. 项目结构2. 插件应用3. 仓库与依赖4. 任务&#xff08;Tasks&#xff09; 三、Gradle在Android项目中的深入应用1. 构建变体&#xff08;Build Variants&#xff09;2. 依赖管理3. 自定义构建逻辑 四、Gradle WrapperGradle W…...