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

C++——入门基础

文章目录

  • 一、前言
  • 二、C++的发展历史
    • 2.1 C++的诞生
    • 2.2 C++的重要性
  • 三、C++的应用
    • 3.1第一个C++程序
      • 3.2 C版
      • 3.2 C++版
      • 3.3 C版与C++版的区分
    • 3.2 namespace关键字
      • 3.2.1 namespace的意义
      • 3.2.2C++中域的分类
      • 3.2.3 namespace的定义
      • 3.2.4 namespace的实质
      • 3.2.5 namespace的嵌套
    • 3.3 作用域运算符 ::
    • 3.4 命名空间的使用
    • 3.5C++输入和输出
  • 四、总结

一、前言

今天的你还在坚持学习吗?在之前这几个月中,我们学习了C语言,相信大家现在已经可以熟能生巧了吧?但是C语言呢却只是一门底层的基础编程语言,在效率和实现上始终还是比较麻烦。但是麻烦就是用来解决的,因此,一门新的语言——C++应运而生。今天就让我们来解开它的新面纱,进行初步的学习。

二、C++的发展历史

2.1 C++的诞生

C++是一种广泛应用的高级编程语言,最早由本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)在1979年于AT&T贝尔实验室研发。它的设计初衷是结合C语言的高效性和Simula语言的面向对象特性。
在这里插入图片描述

2.2 C++的重要性

TIOBE编程语言排行榜是一个反映编程语言热门程度的指标。它根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以Wikipedia、Amazon、YouTube和Baidu(百度)统计出排名数据。该排行榜每月更新一次,旨在展示当前业内程序开发语言的流行使用程度。
排行榜的意义
TIOBE指数可以用来检阅开发者的编程技能是否跟上趋势,或是否有必要作出战略改变,以及什么编程语言是应该及时掌握的。虽然该指数并不能说明一门编程语言的优劣或其代码量,但它对世界范围内开发语言的走势具有重要参考意义。
在这里插入图片描述

三、C++的应用

3.1第一个C++程序

不知道大家还记得我们在学习C语言的时候遇到的第一个C程序吗——打印一个hello world。那么我们使用C++又该如何实现呢?请看:

3.2 C版

//C版
#include <stdio.h>
int main()
{printf("hello world\n");return 0;
}

在这里插入图片描述

3.2 C++版

//C++版
#include <iostream>
using namespace std;
int main()
{cout << "hello world" << endl;return 0;
}

在这里插入图片描述

3.3 C版与C++版的区分

我们在使用C语言编写程序代码时,我们所定义的文件名是xxx.c,但是在使用C++编写程序代码的时候,我们定义的文件名却是xxx.cpp。这是因为当使用C语言和C++编写代码的时候,所用到的编译器也不是相同的,所以我们就对文件名的后缀进行区分。
那么大家请看下面这张图片,你又有没有发现什么问题呢?

在这里插入图片描述

相信大家的观察力也是十分的了得,已经看出些许不同了。以上图片的问题就在于——文件后缀名明明是xxx.cpp,但是为什么C语言版本的代码却又运行通过了呢?我们刚刚才说过C++其实是C版本的升级,在语法上,C++兼容C语言的大多数语法,所以C语言实现的hello world依旧可以运行。

3.2 namespace关键字

3.2.1 namespace的意义

在C语言中,我们对于变量的命名可以说是非常随意的,一般自己喜欢怎么命名就怎么命名。但是有时候这是会出问题的,如下图:
在这里插入图片描述

我们定义了一个全局变量abs,并且给它赋值为10,最后再在mian函数中进行打印。这一系列的操作下来,可谓是行云流水,大家也是丝毫没有感觉到问题的存在,因此问题就来了。
我们在定义abs这个变量的时候,并没有意识到abs其实是C语言math.h库中的一个函数——它的作用是取绝对值。函数名是不能用来定义成变量进行赋值的。因此像上图进行程序的编译的时候就会报错。

3.2.2C++中域的分类

C++中域可以分为:全局域、函数局部域、命名作用域、类域;而域所影响的是编译时语法查找的变量/函数/类类型出处的逻辑。那如果我们有了域隔离,是不是就不会出现命名冲突的情况了呢?
注意:局部域和全局域会影响生命周期,命名作用域和类域不影响生命周期。

3.2.3 namespace的定义

在C/C++中,会存在大量的变量、函数和类。这些变量、函数和类的名称都存在于全局作用域中,就会导致非常多的冲突。那么又该如何避免上述问题?这时候就要用到namesapce关键字。
namespce的作用是用来定义命名空间——其中可以定义变量、函数、类等。后面跟命名空间的名字并且后再接一对{}(大括号),{}中就是命名空间的成员。

3.2.4 namespace的实质

namespace的实质就是开辟一块新的域,这个域与全局域相独立。那么在不同的域中,就可以定义相同的相同的变量名了。
在这里插入图片描述
这时命名冲突的问题就解决了。而me:: abs的意思是:我们用namespace定义命名空间从而定义出了一个新的域——me,那我们为了输出abs我们就得到me这个域中取寻找,所以::符号就是去特定的域找寻你想输出的变量、函数、类等。

3.2.5 namespace的嵌套

我们说到namespace实质上是开辟了一个新的域,那如果在这块新的域中我们还想细分怎么办呢?又该如何细分呢?大家请看下面问题:
阿强和阿珍是一对非常要好的朋友,有一天它们被分配到了同一个小组做项目,阿强是项目A,阿珍是项目B,由于他们心意比较相通,他们的项目名想的都一样,为了避免冲突又该如何实现呢?
在这里插入图片描述
在这里插入图片描述

//C语言版
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
namespace Group
{namespace aqiang{int Add(int num1, int num2){return num1 + num2;}}namespace azhen{int Add(int num1, int num2){return (num1 + num2) * 10;}}
}
int main()
{printf("%d\n", Group::aqiang::Add(1, 2));printf("%d\n", Group::azhen::Add(1, 2));return 0;
}

在这里插入图片描述

//C++版
#include <iostream>
using namespace std;
namespace Group
{namespace aqiang{int Add(int num1, int num2){return num1 + num2;}}namespace azhen{int Add(int num1, int num2){return (num1 + num2) * 10;}}
}
int main()
{cout << (Group::aqiang::Add(1, 2)) << endl;cout << (Group::azhen::Add(1, 2)) << endl;return 0;
}

由此可以看出:namespace是支持嵌套定义的。

3.3 作用域运算符 ::

刚才我们在输出值的时候用到了一个运算符——::,那它的作用又到底是什么呢?::的名字叫做作用域运算符。它可以用于限定的作用域,比如访问全局变量、访问类的静态成员、在类外部定义类成员函数等。
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int a = 20;
namespace me
{int a = 10;
}
int main()
{printf("%d\n", ::a);//::前什么都不加就是到全局去找printf("%d\n",me:: a);//::前加了域名就是到特定的域里面去找return 0;
}

3.4 命名空间的使用

在编译查找一个变量/函数/类的定义或者声明时,会先到局部域去查找,若局部域找不到则会到全局域去查找,但是不会去命名空间里面查找,但是如果我们想使用命名空间中的变量/函数/类的时候,可以使用如下三种方法:
1、指定命名空间访问:

//指定命名空间访问
#include <stdio.h>
#include <stdlib.h>
namespace me
{int a = 1;int b = 2;
}
int main()
{printf("%d\n", me::a);printf("%d\n", me::b);return 0;
}

2、展示命名空间中局部成员:

//展开命名空间中局部成员
#include <stdio.h>
#include <stdlib.h>
namespace me
{int a = 1;int b = 2;
}
using me::a;
using me::b;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}

3、展开命名空间中全部成员——冲突风险大

//展开命名空间中全部成员
#include <stdio.h>
#include <stdlib.h>
namespace me
{int a = 1;int b = 2;
}
using namespace  me;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}

3.5C++输入和输出

因为C++兼容C,使用我们在写代码的时候都会将两者混合起来使用。但是现在,我们要讲解C++中的输入和输出。
1、iostream是标准的输入、输出流库,定义了标准的输入、输出对象。它是Input Output Stream的缩写。
2、std::cout是istream类的对象,它主要面向窄字符的标准输入流。
3、std::out是ostream类的对象,它主要面向窄字符的标准输出流。
4、std::endl是一个函数,在流插入输出时,充当一个换行符刷新缓冲区。
5、<< 是流插入运算符,实现向标准输出设备输出数据,>>是流提取运算符,实现向标准输入设备输入数据。
6、使用C++输入输出更加方便,不需要像C那样使printf/scanf这样的输入输出,并且C++的流能够更加好的支持自定义类型对象的输入输出。
7、cout/cin/endl等属于C++标准库,C++标准库放在一个叫做std(stdandard)的命名空间中,所以在使用的时候需要使用访问命名空间的方式。

//在没有使用std命名空间情况下
#include <iostream>
int main()
{int a = 6;double b = 6.6;char c = 'x';std::cout << a << std::endl << b << std::endl << c << std::endl;//统一一排输出std::cout << std::endl;std::cout << a << std::endl;//分开输出std::cout << b << std::endl;std::cout << c << std::endl;return 0;
}
//在使用了std命名空间情况下
#include <iostream>
using namespace std;
int main()
{int a = 6;double b = 6.6;char c = 'x';cout << a << endl << b << endl << c << endl;//统一一排输出cout << endl;cout << a << endl;//分开输出cout << b << endl;cout << c << endl;return 0;
}

四、总结

欧克,现在关于C++入门的相关知识就差不多讲解完毕了,由于这才是我们学习C++开始,所以分享的知识都比较基础和易懂,大家下来一定要好好消化,不然在接下来的C++学习过程中就会感到非常吃力了。大家可以和C语言相互比较学习,这样理解起来也会快很多。The best wishes for you!

学无止境,让我们不断探索新知识,开拓新视野。

相关文章:

  • C++学习笔记(四十二)——STL之堆操作算法
  • 嵌入式程序发开思路
  • IntelliJ IDEA 内存优化
  • 数据中心平台建设方案技术方案(Word)
  • 制作一款打飞机游戏28:编辑器完善鲁棒性
  • 回归预测 | Matlab实现DBO-LightGBM蜣螂算法优化轻量级梯度提升机多输入单输出回归预测,作者:机器学习之心
  • 在使用Python的Selenium库打卡网页后,通过CDP命令获取所有cookies(包括Httponly和Secure的cookies)
  • 【大模型ChatGPT+R-Meta】AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表“
  • jclasslib 与 BinEd 结合的二进制分析技术指南
  • Vue中自定义指令钩子详解
  • 数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记6
  • git 查看用户信息
  • git pull报错error: cannot lock ref ‘refs/remotes/origin/feature/xxx
  • InferType和_checked_type的区别?
  • Qt/C++面试【速通笔记四】—Qt中的MVC模式
  • es2025新特性
  • 全开源、私有化部署!轻量级用户行为分析系统-ClkLog
  • 【JAVAFX】controller中反射调用@FXML的点击事件失败
  • 使用KNN预测图像
  • ECharts散点图-散点图20,附视频讲解与代码下载
  • 贸促会答澎湃:5月22日将举办2025年贸易投资促进峰会
  • 辽宁省信访局副局长于江调任辽宁省监狱管理局局长
  • 我国风电光伏装机历史性超过火电
  • 记录发生真相,南沙岛礁生态调查纪实片《归巢》发布
  • 印控克什米尔恐袭引爆印巴新一轮外交摩擦,地区安全风险骤增
  • 梁启超“失肾记”的余波:中西医论战与最后的真相