C++:C++入门基础|命名空间|输入输出

欢迎来到Harper·Lee的学习笔记!
博主主页传送门: Harper·Lee的博客主页!
想要一起进步的uu来后台哦!

一、什么是C++?

在此之前,我们所学习的C语言是一种结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了面向对象思想(OOP,即object oriented programming),支持面向对象的程序设计语言应运而生。
1982年,本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此: C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
image.png

二、C++的发展史

1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为 C with classes。C++的发展主要经历了以下几个阶段:

阶段发展内容
C with classes类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符重载等
C++1.0添加虚函数概念,函数和运算符重载,引用、常量等
C++2.0更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静态成员以及const成员函数
C++3.0进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处理
C++98C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)
C++03C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性
C++05C++标准委员会发布了一份计数报告(Technical Report,TR1),正式更名C++0x,即:计划在本世纪第一个10年的某个时间发布
C++11增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循环、auto关键字、新容器、列表初始化、标准线程库等
C++14对C++11的扩展,主要是修复C++11中漏洞以及改进,比如:泛型的lambda表达式,auto的返回值类型推导,二进制字面常量等
C++17在C++11上做了一些小幅改进,增加了19个新特性,比如:static_assert()的文本信息可选,Fold表达式用于可变的模板,if和switch语句中的初始化器等
C++20自C++11以来最大的发行版,引入了许多新的特性,比如:模块(Modules)、协程(Coroutines)、范围(Ranges)、概念(Constraints)等重大特性,还有对已有特性的更新:比如Lambda支持模板、范围for支持初始化等
C++23制定ing(中间出现一些小插曲)
C++26……

时间轴如下:
image.png
虽然C++技术不断地在发展,但是目前大多数的公司使用的是C++98和C++11标准。

三、C++的就业方向(涉及领域)

image.png
根据上图最新的TIOBE调查结果可知,C++、C、python都是比较热门的编程语言,发展前景比较好,因此就业前景相对广阔,一些自然也相对卷一些。在未来我们至少需要学习两门以上的编程语言,因此,不要走马观花的学习,而是要精益求精,实质性的精通掌握一两门语言。这样,上手其他语言时也会比较的得心应手。
注意:排名不能说明哪个语言好,哪个不好,每门编程语言都有适应自己的应用场景。
C++的应用领域比较广阔,主要包括以下几个领域:

  1. 软件开发。包括大型系统软件开发,例如编译器、数据库、操作系统、浏览器等,还有小型软件开发,像CAD软件开发、SDK应用开发、军工类软件开发 、数据库开发等。
  2. 服务器端开发。例如一个美团接单环节:商家是否开业是否接单、上架什么菜品、如何接单、如何分配骑手、对个别不合理的行为如何举报拉黑等。
  3. 游戏开发。**游戏开发要掌握C++基础和数据结构,学习图形学知识,掌握游戏引擎和框架,了解引擎实现。**比如:魔兽世界、传奇、CS、跑跑卡丁车等。
  4. 嵌入式和物联网领域。嵌入式把具有计算能力的主控板嵌⼊到机器装置或者电子装置的内部,通过软件能够控制这些装置。大致上,嵌⼊式开发主要分为嵌入式应⽤和嵌入式驱动开发。常见的岗位有:嵌入式开发工程师、驱动开发工程师、系统开发工程师、Linux开发工程师、固件开发工程师等。
  5. 音视频与图形处理。**数字图像处理中涉及到大量数学矩阵方面的运算,对CPU算力要求比较高,主要的图像处理算法库和开源库等都是C/C++写的;⾳视频开发最主要的技术栈就是C++。**例如OpenCV、OpenGL、Photoshop等。
  6. 人工智能。人工智能(机器学习)的核心是机器学习、算法,它们大多数都是C++实现的,不仅需要很强的数学能力,同时一般都要求高学历。
  7. 测试开发/测试

校招都是公司需要什么技能自己就学习什么技能的,因此要学会包装自己,有方向地调衡自己。
学习C++:![image.png](https://img-blog.csdnimg.cn/img_convert/fb93b6c50bfdc9ae273542c094146ff7.png

四、C++的关键字(C++98)

asmdoifreturntrycontinue
autodoubleinlineshorttypedeffor
booldynamic_castintsignedtypeidpiblic
breakelselongsizeoftypenamethrow
caseenummutablestaticunionwchar_t
catchexplicitnamespacestatic_castunsigneddefault
charexportnewstructusingfriend
classexternoperatorswitchvirtualregister
constfalseprivatetemplatevoidtrue
const_castfloatprotectedthisvolatilewhile
deletegotoreinterpret_cast

五、C++的输入与输出

  1. :Input Output Stream的缩写,是标准的输⼊输出流库,定义了标准的输⼊、输出对象。新版本的c++为了区分C语言,没有加入 .h 的后缀。
  2. std:是C++官方库内容定义的命名空间。
  3. cin(标准输入对象) :console in的缩写,是istream类型的对象,控制台输入,可自动识别类型,包含在头文件中
  4. cout(标准输出对象):console ourt的缩写,是ostream类型的对象,控制台输出,可自动识别类型,包含在头文件中
  5. 根据前两条,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现的),不用像C语言中的printf/scanf那样手动控制格式。
  6. endl:endline,是一个函数,相当于换行,包含在头文件中
  7. <<:流插⼊运算符,>>:流提取运算符。它们都涉及到运算符重载的相关知识,而且不是只能输入输出在控制台。(C语言用这两个运算符做位运算左移/右移)
  8. cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去用他们
  9. C语言中可以通过占位符控制浮点数的精度,但是C++比较复杂,可直接使用C语言的方式,C语言和C++相辅相成。
  10. 这⾥我们没有包含<stdio.h>,也可以使用printf和scanf,在包含间接包含了。vs系列编译器是这样的,其他编译器可能会报错。
#include <iostream>
#include <stdlib.h>

using namespace std;//全部展开std标准库

int main()
{
    int a = 0;
    double b = 3.0;
    char c = 'x';

    cout << "Harper·Lee" << endl;
    //cout:标准输出对象(控制台)
    // << :流插入运算符;>>:流提取运算符
    //endl:end line,相当于换行符
    std::cout << a << endl;//因为上面已经展开了,就不需要指定了
    cout << a << " " << b << endl;

    //可以自动识别变量的类型
    cin >> a;
    cin >> b >> c;
    cout << a << endl;
    cout << &a << endl;
    cout << b << " " << c << endl;
    //cin:标准输入对象(键盘)

    return 0;
}

运行结果:
image.png

#include<iostream>

using namespace std;

int main()
{
    // 在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码
    // 可以提⾼C++IO效率
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    return 0;
}

六、C++参考文档

https://legacy.cplusplus.com/reference/?(非C++官方文档)
https://zh.cppreference.com/w/cpp?(中文版)
https://en.cppreference.com/w/?(英文官方版)
书籍参考:C++Primer(作为语法字典) / Effective C++侯捷(应用经验和坑) / STL源码剖析(库底层、中后期)。
image.png
C++学起来很难是必然的,因为就语法而言,C++要解决C语言的一些问题,也要追求效率,此外历史发展比较早,发展历程总会有些许坎坷。

七、命名空间

7.1 C++中的域

  1. C++中域包括:函数局部域,全局域,命名空间域,类域
  2. 域影响的是编译时语法查找⼀个变量/函数/类型出处**(声明或定义)**的逻辑,所以有了域隔离,名字冲突就解决了。
  3. 局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。

请注意:

  1. 在同一个域里面不能重复定义同一个名称的变量。
  2. 在不同的域里面能定义同一个名称的变量。

7.2 域作用限定符(::)

  1. **符号 :: **
  2. 作用:可以避开局部的,直接访问全局的。
  3. :: 域作用限定符左边是空白就默认代表访问的是全局域。
  4. 用法:直接在变量前加上限定符即可。
  5. 在 .cpp文件中才支持域作用限定符,.c 文件中是不支持域作用限定符的。
  6. 在C语言中,当局部变量与全局变量冲突时,优先使用局部变量。
//test.cpp
#include <stdio.h>
int a = 10;//全局变量

int main()
{
	int a = 5;
	printf("%d\n", a);
    //通过局部域作用限定符访问指定命名空间的变量
    printf("%d\n",::a);//::符号前面是空白(有无空格都一样),默认代表访问的是全局域
	return 0;
}

image.png

7.3 命名空间的由来

7.3.1 什么是命名空间?

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

7.3.2 为什么会有命名空间?

有如下的代码:

#include <stdio.h>
#include <stdlib.h>

int rand = 10;

int main()
{
    printf("%d\n", rand);
    return 0;
}//我们定义的变量名和库里面的名称冲突了

报错:image.png
首先我们分析一下为什么会有这样的错误:
报错原因: 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”。rand在cpp文件里面是定义的一个变量,但是rand在stdlib库中代表一个函数,就出现了重定义的情况,在这里就叫做命名冲突。(注意:rand作为函数时,函数名默认是函数的地址。)
解决方法:这种情况在C语言中可以通过重新修改变量的名字,使其不再与关键字或者函数名重名即可;在c++中,可以通过命名空间解决。

#include <stdio.h>
#include <iostream>
#include <stdlib.h>

namespace Harper//定义了一个命名空间域
{
    int rand = 10;//在bit命名空间里面,rand仍然是全局变量
}
void func()
{
    printf("%p\n", rand);//访问的是函数指针,函数名默认是函数的地址,%d改成%p
    printf("%d\n",Harper::rand);//打印访问Harper命名空间中变量rand的值
}
int main()
{
    func();
    return 0;
}

运行结果:
image.png

7.4 命名空间的定义

namespace关键字定义全局命名空间域,后面跟命名空间的名字,然后接⼀对 {} 即可,{}中即为命名空间的成员。

#include <iostream>
#include <stdlib.h>

namespace Harper
{
	int year = 19;
}

int main()
{
	printf("%d\n", Harper::year);
	return 0;
}

运行结果:
image.png

7.5 命名空间的性质

  1. 命名空间中可以定义变量/函数/类型等。
#include <iostream>
#include <stdlib.h>
namespace Harper
{
	// 命名空间中可以定义变量/函数/类型
	int rand = 10;
	int Add(int left, int right)
	{
		return left + right;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
}
int main()
{
    //函数调用
	printf("%d\n", Harper::Add(1, 1));
    //结构体
	struct Harper::Node p1;//而不是Harper:: struct Node p1;
                           //因为对象是Node,struct是关键字
	return 0;
} 
  1. 命名空间需要定义一个域:命名空间域。命名空间域不会影响其中变量的生命周期。
  2. 为了避免冲突,c++把标准库的内容定义到了官方的命名空间中,这个命名空间叫做std。std是C++官方库内容定义的命名空间。

7.6 命名空间的嵌套定义

namespace只能定义在全局,但是它可以嵌套定义。就像多个项目组里会定义出一样的名称,可以通过namespace解决;但如果在一个项目组即同一个命名空间里面,各个分工合并代码时就出现冲突了,这样就可以通过在同一个命名空间里嵌套再次定义命名空间。

#include <iostream>
#include <stdlib.h>

namespace Harper
{
	namespace Lee
	{
		int rand = 10;
		int Add(int left, int right)
		{
			return left + right;
		}
	}
	namespace Aururo
	{
		int Sub(int left, int right)
		{
			return left * right;
		}
	}
}

int main()
{
	printf("%d\n", Harper::Lee::Add(1, 1));
	printf("%d\n", Harper::Aururo::Sub(2, 3));
	return 0;
}

运行结果:
image.png

7.7 命名空间的合并

  1. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会将其合并在同一命名空间中。
  2. 不同⽂件中可以定义同名namespace,他们会默认合并到⼀起,就像同⼀个namespace⼀样。
#include <iostream>
#include <stdlib.h>
namespace Harper
{
	int rand = 5;
}
namespace Harper
{
	int ret = 1;
}
int main()
{
	printf("%d\n", Harper::rand + Harper::ret);
	return 0;
}//文件中的同理

运行结果:
image.png

7.8 命名空间的使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。因此我我们可以通过三三种方式访问命名空间。

7.8.1 域作用限定符访问

指定命名空间访问,项目中比较推荐这种方式。

#include <stdio.h>
#include <stdlib.h>

namespace Harper
{
    int rand = 10;
}

void func()
{
    printf("%d\n", Harper::rand);
}

7.8.2 using部分展开

使用using展开命名空间中某个频繁使用的成员,项目中经常访问的不存在冲突的成员可使用此法。

#include <iostream>
#include <stdlib.h>

namespace Harper
{
	int year = 19;
	int a = 6;
}

using Harper::a;//展开常用的a

int main()
{
	printf("%d\n", Harper::a);
	return 0;
}

7.8.3 using namespace整个展开

使用using namespace展开整个命名空间,在项目中并不推荐,冲突的风险很大,可在日常的小练习中使用全部展开,将这个繁琐的指定命名空间过程化简。

#include <iostream>
#include <stdlib.h>
//展开整个命名空间
namespace Harper
{
	int year = 19;
}

using namespace Harper;

int main()
{
	printf("%d\n", Harper::year);
	return 0;
}

注意:

  1. 展开命名空间:编译器将命名空间的域拆开寻找(相当于去掉域这个束缚);
  2. 展开头文件:将头文件的内容拷贝过来;
  3. using namespace相当于把命名变量的隔离墙给拆了,就会有命名冲突的风险。

喜欢的uu记得三连支持一下哦!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/787137.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】MDK的编译过程及文件类型全解

1.编译过程简介 编译&#xff1a;MDK软件使用的编译器是armcc和armasm&#xff0c; 它们根据每个c/c和汇编源文件编译成对应的以“.o”为后缀名的对象文件(Object Code&#xff0c;也称目标文件)&#xff0c; 其内容主要是从源文件编译得到的机器码&#xff0c;包含了代码、数据…

怎么压缩ppt?这几种压缩方法大家都在用!

怎么压缩ppt&#xff1f;当我们沉浸在PPT创作的海洋中&#xff0c;每一个精心的布局、每一个动人的动画&#xff0c;都仿佛是我们心血的结晶&#xff0c;然而&#xff0c;随着我们不断雕琢&#xff0c;PPT文件的大小也在悄然增长&#xff0c;如同一只隐形的巨兽&#xff0c;在不…

无线充电宝哪个牌子好?绿联、西圣、小米充电宝测评对比!

随着科技的不断进步和智能设备的普及&#xff0c;无线充电宝逐渐成为了现代人生活中的必需品。它们不仅方便了我们的日常充电需求&#xff0c;更减少了线缆的束缚&#xff0c;提高了使用的便捷性。在众多品牌中&#xff0c;绿联、西圣和小米作为市场上广受好评的无线充电宝品牌…

Windows下载、配置Java JDK开发环境的方法

本文介绍在Windows电脑中&#xff0c;安装JDK&#xff08;Java Development Kit&#xff09;&#xff0c;也就是Java开发工具包的详细方法。 JDK是Java软件开发的基础&#xff0c;由Oracle公司提供&#xff0c;用于构建在Java平台上运行的应用程序与组件等&#xff1b;其已经包…

【windows】安装抓包工具Burp Suite 2024激活汉化

前言 在项目即将上线阶段&#xff0c;迈入生产环境之际&#xff0c;确保其安全性成为我们不可忽视的首要任务。为筑起一道坚不可摧的安全防线&#xff0c;我们借助业界公认的网络安全利器——Burp Suite&#xff0c;我们将展开一场全面的安全测试&#xff0c;旨在探查并消除任…

旗晟机器人AI智能算法有哪些?

在当今迅猛发展的工业4.0时代&#xff0c;智能制造和自动化运维已然成为工业发展至关重要的核心驱动力。伴随技术的持续进步&#xff0c;工业场景中的运维巡检已不再单纯地依赖于传统的人工运维方式&#xff0c;而是愈发多地融入了智能化的元素&#xff0c;其中智能巡检运维系统…

数据库MySQL---基础篇

存储和管理数据的仓库 MySQL概述 数据库相关概念 数据库&#xff08;DataBase&#xff09;---数据存储的仓库&#xff0c;数据是有组织的进行存储 数据库管理系统&#xff08;DBMS&#xff09;-----操纵和管理数据库的大型软件 SQL----操作关系型数据库的编程语言&#xff…

文华财经盘立方多空变色波段趋势线指标公式源码

文华财经盘立方多空变色波段趋势线指标公式源码&#xff1a; N1:20; N2:ROUND(N1/2,1); N3:ROUND(SQRT(N1),1); N4:2*EMA2(C,N2)-EMA2(C,N1); 尊重市场:EMA2(N4,N3),COLORRED,LINETHICK2; 尊重市场1:IF(尊重市场<REF(尊重市场,1), 尊重市场,NULL),COLORGREEN,LINETHIC…

gitlab-runner安装部署CI/CD

手动安装 卸载旧版&#xff1a; gitlab-runner --version gitlab-runner stop yum remove gitlab-runner下载gitlab对应版本的runner # https://docs.gitlab.com/runner/install/bleeding-edge.html#download-any-other-tagged-releasecurl -L --output /usr/bin/gitlab-run…

打开IDEA,程序员思考的永远只有两件事!!!

微信公众号&#xff1a;牛奶 Yoka 的小屋 有任何问题。欢迎来撩~ 最近更新&#xff1a;2024/07/09 [大家好&#xff0c;我是牛奶。] 当年面试时背了很多八股文&#xff0c;但在日渐重复的机械工作中&#xff08;产品业务开发&#xff09;&#xff0c;计算机网络、操作系统、算…

leetcode:LCR 018. 验证回文串(python3解法)

难度&#xff1a;简单 给定一个字符串 s &#xff0c;验证 s 是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。 本题中&#xff0c;将空字符串定义为有效的 回文串 。 示例 1: 输入: s "A man, a plan, a canal: Panama" 输出: t…

编辑器 goland 和 visual studio code

goland 编辑器做的真是太好了&#xff0c;面向 go 代码的定制设计&#xff0c;但它是收费软件&#xff0c;价格还贵的超出了自己的经济能力范围。有时候想打几行代码&#xff0c;却没有趁手的兵器&#xff0c;真是难受。但求助免费破解版吧&#xff0c;又需要关注公众号&#x…

Lab1 论文 MapReduce

目录 &#x1f339;前言 &#x1f985;2 Programming Model &#x1f33c;2.1 Example &#x1f33c;2.2 Types &#x1f33c;2.3 More Examples &#x1f985;3 Implementation(实现) &#x1f33c;3.1 ~ 3.3 &#x1f33c;3.4 ~ 3.6 &#x1f985;4 Refinemen…

Java-Redis-Clickhouse-Jenkins-MybatisPlus-Zookeeper-vscode-Docker-jdbc-xxljob

文章目录 Clickhouse基础实操windows docker desktop 下载clickhousespringboot项目配置clickhouse Redis谈下你对Redis的了解&#xff1f;Redis一般都有哪些使用的场景&#xff1f;Redis有哪些常见的功能&#xff1f;Redis支持的数据类型有哪些&#xff1f;Redis为什么这么快…

爬虫怎么实现抓取的

1.4爬虫工程师常用的库通过图1-3我们了解到&#xff0c;爬虫程序的完整链条包括整理需求、分析目标、发出网络请求、文本解析、数据入库和数据出库。其中与代码紧密相关的有&#xff1a;发出网络请求、文本解析、数据入库和数据出库&#xff0c;接下来我们将学习不同阶段中爬虫…

Proxmox VE 8虚拟机直通USB磁盘

作者&#xff1a;田逸&#xff08;fromyz&#xff09; 今天有个兄弟发消息&#xff0c;咨询怎么让插在服务器上的U盾被Proxmox VE上的虚拟机识别。在很久很久以前&#xff0c;我尝试过在Proxmox VE 5以前的版本创建windows虚拟机&#xff0c;并把插在Proxmox VE宿主机上的银行U…

[ TOOLS ] JFLASH 使用说明

一、使用everything查找JFLASH everything是指这个软件&#xff0c;使用这个方便查找想要的文件 二、创建一个工程并配置 创建完后进行配置&#xff1a; Target devic: 板子的芯片型号&#xff0c;比如R7FA6M4Target interface: 一般是SWDSpeed: 一般是4000kHz, 不能下载则将Sp…

快速将一个网址打包成一个exe可执行文件

一、电脑需要node环境 如果没有下面有安装教程&#xff1a; node.js安装及环境配置超详细教程【Windows系统安装包方式】 https://blog.csdn.net/weixin_44893902/article/details/121788104 我的版本是v16.13.1 二、安装nativefier 这是一个GitHub上的开源项目&#xff1a…

ROS2 分布式 及 ssh远程控制 和 上传下载文件或文件夹

问题1. 多台计算机连接同一wifi后 &#xff0c;运行ROS2的小乌龟案例&#xff0c;自己的计算机&#xff0c;无法控制其他电脑的小乌龟 按照正常的情况来说&#xff0c;ROS2是DDS的自发现通信机制&#xff0c;只要处在同一wifi网络中&#xff0c; A计算机执行启动小乌龟的命…

PHP验证日本免费电话号码格式

首先&#xff0c;您需要了解免费电话号码的格式。 日本免费电话也就那么几个号段&#xff1a;0120、0990、0180、0570、0800等开头的&#xff0c;0800稍微特殊点&#xff0c;在手机号里面有080 开头&#xff0c;但是后面不一样了。 关于免费电话号码的划分&#xff0c;全部写…