C++基础入门篇——入得三寸天地,匀开理想三旬

2024-02-17 20:50

本文主要是介绍C++基础入门篇——入得三寸天地,匀开理想三旬,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 传统艺能😎
    • 前言😎
    • 选择😎
    • 嘛是C++😎
    • 命名空间🤔
    • 域作用限定符🤔
    • C++输入与输出🤔
    • 缺省参数🤔
    • 函数重载🤔

传统艺能😎

小编是双非本科大一菜鸟不赘述,欢迎大佬指点江山(QQ:1319365055)
此前博客点我!点我!请搜索博主 【知晓天空之蓝】
乔乔的gitee代码库(打灰人 )欢迎访问,点我!

🎉🎉非科班转码社区诚邀您入驻🎉🎉
小伙伴们,打码路上一路向北,背后烟火,彼岸之前皆是疾苦
一个人的单打独斗不如一群人的砥砺前行
这是我和梦想合伙人组建的社区,诚邀各位有志之士的加入!!
社区用户好文均加精(“标兵”文章字数2000+加精,“达人”文章字数1500+加精)
直达: 社区链接点我

🎉🎉🎉倾力打造转码社区微信公众号,等你加入!🎉🎉🎉


在这里插入图片描述

前言😎

没错,当你看到这里的时候说明我们C语言部分已经完结辣,初级的数据结构基础已经拿捏,我将步入C++的净土。

在这里插入图片描述

你可能会说:啊这,不是上一篇才八大排序,算法还没搞完就跳到C++了?是什么让我做出这么跳跃的决定

首先算法本来就是代码的思想素养,他应该在积累中绽放身姿,本来我想放在最后期来学习和讲解,现在写出来单纯是因为觉得现在咱有能力拿捏他,何尝不去细节的拿捏一波呢?所以这和本来我计划的学习大纲并不冲突捏~
在这里插入图片描述

选择😎

至于我为什么会选中去深入学习 C++ 也是有原因的,并非脑子发热一时兴起之举。

在学习C语言之初就为未来学习方向打听了解了很多,很长时间后我才决定将我的目光投向 C++ 或者 JAVA,二者对于我这个又菜又爱玩的萌新来说无疑都极具吸引力,但是鱼和熊掌不可兼得,专精才是真爱,海王最后注定一无所有,摒着这个思想我狠狠去各大网站平台,某乎,pilipili,CSDN,甚至浏览器上各种不知名散装帖子。我承认,各抒己见,我被灌输了很多不同的意见和观点,导致我对于选择更加焦灼与懵b。

因此我转身去了解了一手前端和后端,从本身去了解 c++ 和 扎瓦,两者学习难度是一样的,憋听世面上说什么扎瓦简单易学,从来没有一门语言是简单易学的,简单易学的语言只适合小型玩具程序,而且从目前Java庞大的类库看来,简单易学好像根本没有了;最后综合了心态,环境和个人兴趣还是把镖扔向了C++

嘛是C++😎

C++和C一样吗?跟卡巴斯基和巴基斯坦一样,有个基巴关系,但也不是完全没关系,C++里面好歹带了个C,就不难知道他和 C 语言还多少有点渊源。

C语言是模块化和结构化的语言,只适合处理规模小的程序,对于复杂的大规模程序,C语言需要高度的建模与抽象,就显得尤为吃力与不适,为了解决这个尴尬,80年代提出了OOP,即 面向对象编程,C++,因此横空出世。

(搬个老图,面对对象实在太草了)

在这里插入图片描述

这是在C语言基础上引入并扩充了面向对象概念,为了表达和C语言的渊源,就命名为了C++(最早是贝尔实验室命名为 C with classes,即加入了类的概念)。

某度对面向对象的定义是这样的:

面向对象程序设计(Object Oriented Programming,OOP)是一种计算机编程架构。. OOP的一条基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。. OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。. OOP=对象+类+继承+多态+消息,其中核心概念是类和对象

在这里插入图片描述

不慌,我们慢慢来

命名空间🤔

但凡有看过C++的铁汁都会注意到,C++里面有个头文件是

 #include<iostream> 

他就相当于我们C语言里面的<stdio.h>,他是在控制台对 IO 流进行输入输出操作的,接着你会看到一个

using namespace std;

为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称。using 就是引用,他在引用一个命名空间 namespace,我们这里又会牵扯到一个命名冲突问题,即同一个域里面,不能有同名变量,C语言没有很好的解决这个问题,而CPP正好帮他擦了屁股

像C语言里面二级指针啥的太绕了,因此C++就产生了引用这个概念,本质上就是在对C语言的一个补充作用,所以C++基础语法也是无时无刻在为C语言补坑。要知道我们定义一个变量要注意两点,一就是要符合命名规则,二就是不能和关键字重名,比如定义了一个叫 number 的同时再定义一个叫 number 的函数或者定义一个 number() 函数,但在另一个可用的库中也存在一个相同的函数 number()。这样,编译器就无法判断您所使用的是哪一个 number() 函数

但是引用了命名空间就不一样了,这个空间仿佛一片净土给予他逍遥法外的机会,就是这么个原理。
在这里插入图片描述

域作用限定符🤔

我们在程序里定义了两个同名变量 a,一个是全局变量一个是局部变量,那么我能在 main 函数里面 printf 一下全局变量 a 的值吗?答案是可以的!我们写作如下:

int a = 0;
int main()
{
int a = 1;
printf("%d\n",a);//打印局部变量 1
printf("%d\n",::a);//打印全局变量 0
}

那么问题来了,这个 ::到底何方神圣?他就是域作用限定符,双冒号左边是空白,我们就默认它是全局变量的 a 。

所以就可以知道命名空间是如何解决命名冲突问题的,如下是一个命名空间域,他和结构体不一样啊,他的作用是让里面的成员和外界成员形成一个隔离,需要访问域内成员就可以单独访问,避免冲突。

namespace room//命名空间域
{
int a = 0;//全局变量名
int rand = 0;//stdlib库变量名
}
printf("%d\n",room::a);
printf("%d\n",room::rand);//域内成员访问

注意如果多文件下定义了重名的命名空间,它是可以同时存在的,语法会默认将同名的命名空间进行合并。但是命名空间里面如果有重名的变量就会发生冲突,同样的道理我们可以借助命名空间的嵌套解决,再加一层命名空间即可,注意命名空间套个两三层就绝对的多了不可多套。

我们要用命名空间里的对象时,直接啪一句即可

 using namespace xxx;//把xxx这个命名空间定义的东西放出来

就好像一个声明告诉你现在隔离层拆了,freedom!变得和全局变量差不多;我们甚至还能继续向里展开,比如 room 里的变量 a ,我们命名空间不能完全展完,展完就没有意义辣!严格来说不能随便去展开。
在这里插入图片描述

所以我们常见的一句声明: using namespace std;

这里 std 就是对C++库的封装,当然不写这句话也行,实际应用就需要域作用限定符去指定域名。我们放出来虽然方便使用,但是存在冲突风险,比如定义一个全局变量 cout 后使用 cout<<cout<<endl。为了解决冲突与方便问题,我们提出了第三种方式,非全展开,我们展开常用的就行:

using std::cout;

C++输入与输出🤔

C语言输入输出需要我们指定类型的 scanf 与 printf ,C++里面又不一样了,我们对应使用的是流提取运算符 >> 和流插入运算符 <<

cin >> a;
cout << a;

这个在C++里面叫运算符重载,cin 和 cout 叫对象,属于类和对象的知识,暂只做了解。

他相比C语言的改进就非常奈斯了,因为输入输出可以多组输入输出,不用指定数据类型且可以交错类型,比如:

int a;
float b;
cin >> a >> b;
cout << a << b << endl;//endl相当于一个换行关键字,等价于‘\n’

但是C++想控制浮点数的位数输出就很麻烦了,想了解的情自行上网查询,但是极其不推荐,因为你会了也记不住,而且别忘了C++兼容C语言,直接C语言多方便啊是吧,所以要控制格式推荐C语言实现。
在这里插入图片描述

缺省参数🤔

C++引入了一个新的概念叫缺省参数,也叫默认参数,这是C语言没有的语法,指调用函数没有传参时,会使用参数的默认值,就好像你若安好,备胎到老。

那如果对应是多个输入呢?是不是需要多个缺省参数,备胎成堆那不是更渣吗?

void func(int a = 1,int b = 2,int c= 3)
{
cout << "a= " << a << endl;
cout << "b= " << b << endl;
cout << "c= " << c << endl;
}int main()
{
func();
func(10);
func(10,20);
func(10,20,30);
return 0;
}

结果如下:
在这里插入图片描述

我们这里是给所有参数都给出了默认值,我们称之为全缺省,有全必有不全,我们的半缺省就横空出世了,半缺省还有一些细节需要注意,他必须是从右往左缺省并且是连续的

全缺省和半缺省的选择视情况而定,在某些情景里面半缺省也是很奈斯的,比如我们的栈。

struct Stack
{
int* a;
int size;
int capacity;
};void StackInit(struct Stack* p,int n = 4)
{
assert(p);
p->a =(int*) malloc(sizeof(int)*n);
p->size = 0;
p->capacity = n;
}
int main()
{
Stack st;
StackInit(&st,100);//初始容量和扩容参数上比较方便
}

函数重载🤔

又来补坑辣,C语言不支持同名函数,但是C++支持。

要求就是参数名相同而参数不同,比如个数,类型等等。我们需要知道函数重载到底有什么意义,C语言为什么不支持?比如我实现 swap 函数来交换两数的值,分别交换一组整型和一组浮点数,两组数类型不同因此需要两个 swap 函数,是不是想到就很不爽。

所以C++支持同名。,看起来是一个函数但实际是相互独立的,后期的模板就能把这个玩通透。

今天就到这里吧,摸了家人们。

这篇关于C++基础入门篇——入得三寸天地,匀开理想三旬的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/718955

相关文章

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用