【C++学习】C++入门(1)

写在前面

欢迎来到C++的世界,这是一门令人兴奋的语言。

好吧,每当我开始阅读C++的书籍的时候,开头的第一句话必定是这个,

也不知道其他语言的编程书籍是不是这样,那就让这句话也作为我C++分享之路上的第一句话吧。

目录

写在前面

1. C++怎么学?

1. C语言

2. Object-Oriented C++

3. Template C++

4. STL

2. 第一个C++程序

3. 命名空间

namespace的用法

4. 输入输出

写在最后:


1. C++怎么学?

这篇文章我也打算将一点C++入门的语法,不过在那之前,我想聊一聊,C++该怎么学?

最近我阅读了Scott Meyers大佬写的Effective C++,觉得他写的非常不错,

我就以他书中的第一条条款作为C++的介绍,也就是回答C++怎么学这个问题。

条款1:视C++为一个语言联邦

学C++你学要从这四个方面入手:

1. C语言

是的,C++是基于C语言的一门语言,如果你没有一个扎实的C语言基础,那你学C++会很难受,

这边建议赶紧去学好C语言,再来学C++,不要贪快。

2. Object-Oriented C++

说人话就是面向对象,C++包含了面向对象的特性,即所谓封装,继承,多态,

在这个C++学习的专栏中,我也打算从类和对象入手,开始讲解C++。

3. Template C++

也就是模板,这里是C++的泛型编程的部分,实际上模板的威力强大,它带来了崭新的编程规范,

即:模板元编程,但是我这里就不这么深入了,学好模板的特性就基本够用了

4. STL

STL是一个标准模板库,这是C++非常重要的组成部分,每个C++程序员都需要和STL一起工作,

学好STL自然非常必要,之后我会探索STL一些经典容器/适配器的底层,让我们更好的理解STL。

当然,

学好了上述的几个知识,你就可以说你是一个会C++的程序员了,虽然离精通还远远算不上,

C++的知识自然不止这几个部分,还有C++11的新语法,未来C++也会继续更新(虽然很慢)

它还有许多重要的,区别于C语言的新特性, 而这些新特性,就是我接下来准备介绍的,

C++入门的内容,衔接C语言,让我们一起走进C++的世界!

(PS:瞻仰一下C++祖师爷的帅照,感谢一下祖师爷赏饭吃,不然都没有C++程序员这个工作)

2. 第一个C++程序

#include <iostream>
using namespace std;

int main()
{
	cout << "hello world!" << endl;
	return 0;
}

输出:

hello world!

怎么说呢,其实C++跟C语言确实是不分家的,

学过C语言的我们都知道,最上面的是头文件,下面是主函数,还有return 0,

那个cout和cin一看就知道是输入输出相关的东西,

那么第二行是个啥呢?

这就要说到C++的第一个知识点了:

3. 命名空间

我们来看这段代码:

#include <stdio.h>

int printf = 0;

int main()
{
	return 0;
}

很显然,这段代码是编译不通过的,

因为printf是stdio.h里面的一个函数,这就是C语言中命名冲突的问题,

1. 我们的跟库里的冲突

2. 我们与其他人协作项目的时候冲突

你没办法知道库里究竟用了啥名字,你也不知道其他人用了啥名字,

C++为了解决这样的问题,就提供了这样一个关键字:namespace

namespace的用法

比如说,我们想让前面那段代码不再冲突:

 我们发现这样是可以运行成功的,

这个就是命名空间,在这个命名空间的{ }内,是一个域。 

实际上我们在C语言阶段就学过变量的作用域,(还记得局部优先的原则吧)

比如说这段代码:

#include <stdio.h>

int a = 10;

int main()
{
	int a = 1;
	printf("%d\n", a);
	printf("%d\n", ::a);

	return 0;
}

我们直接访问a,优先选择的是局部域内的变量,

如果我们偏要访问全局变量a呢?

可以用域作用限定符,用法如上,

输出:

1
10

再比如说,看这段代码:

#include <stdio.h>

namespace xl {
	int a = 10;
}

int main()
{
	int a = 1;
	printf("%d\n", a);
	printf("%d\n", xl::a);

	return 0;
}

我们可以这样访问命名空间内的变量,

实际上,我们的程序是不会主动到命名空间域搜索的,

只有我们自己指定,才会前往:

#include <stdio.h>

namespace xl {
	int a = 10;
}

int main()
{
	printf("%d\n", a);

	return 0;
}

这样的代码时无法编译的。

这个时候你大概就知道命名空间的左右了,

除了直接指定命名空间使用变量,也可以将命名空间展开,

(其实就是将变量暴露到外面)

来看代码:

#include <stdio.h>

namespace xl {
	int a = 10;
}

using namespace xl;

int main()
{
	printf("%d\n", a);

	return 0;
}

这样子,我们也能访问a变量,

 这个时候,我们应该也能大概知道最开始那段代码,

using namespace std; 是什么意思了,其实就是展开了C++标准库的命名空间。

当然,像我们这样直接展开只是方便我们平时练习代码,

其实在做项目的时候,我们不会直接将这样一个大的命名空间直接展开的,

不然还加这个命名空间干啥。

来看看不展开的代码:

#include <iostream>

int main()
{
	std::cout << "hello world!" << std::endl;
	return 0;
}

这样我们就解决了这个问题,来看代码:

#include <stdio.h>

namespace xl {
	int printf = 10;
}

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

输出:

hello
10

实际上,C语言可解决不了这样的情况。

补充:

命名空间是支持嵌套的,来看例子:

#include <stdio.h>

namespace xl {
	namespace me {
		int printf = 10;
	}
}

int main()
{
	printf("hello\n");
	printf("%d\n", xl::me::printf);
	return 0;
}

这个就是命名空间的嵌套,有些场景还是会用到的。

另外,同名的命名空间会自动合并在一起,来看例子:

#include <stdio.h>

namespace xl {
	int x = 10;
}

namespace xl {
	int y = 20;
}

int main()
{
	printf("%d\n", xl::x);
	printf("%d\n", xl::y);
	return 0;
}

扩展知识:

不知道你有没有想过,为什么C++的头文件不像C语言头文件,

C语言的头文件都有.h的后缀,例如:stdio.h,string.h等等,

而C++的头文件却没有.h,例如:iostream, vector等等,

实际上,在一些很老的编译器下,是支持所谓#include <iostream.h>这种带.h的头文件的,

比如说 VC6.0,这些头文件是没有被命名空间包裹的,但是后来,

C++把所有的这些头文件的内容都塞到std命名空间里面了,为了和以前区分,

就把塞进命名空间的这部分头文件改成没有.h结尾的,像#include <iostream>

然后带命名空间确实很好用,C++就慢慢把带.h结尾的头文件淘汰了,

所以现在C++标准库的头文件基本就都不带.h了。

补充:

如果我们不展开整个命名空间,但是有一些变量,对象或者函数我们需要经常调用,

该怎么解决?我们可以指定访问

来看例子:

#include <iostream>
using std::cout;
using std::endl;

int main()
{
	cout << "hello world" << endl;
	return 0;
}

用using std::,就能指定访问了。

这样就不用把整个命名空间展开,展开常用的就行。

4. 输入输出

cout,cin这些是对象,

cout这些对比printf,他能自动识别类型。

我们直接来看例子:

#include <iostream>
using namespace std;

int main()
{
	//   << 流插入运算符   endl 我们可以直接理解成 \n
	cout << "hello world" << endl;
	
	int n = 10; //自动识别类型
	cout << n << endl;

	double x = 1.1;
	//  >> 流提取运算符,他也能自动识别类型
	cin >> x;
	cout << x << endl;

	return 0;
}	

输入:

2.22

输出:

hello world
10
2.22
2.22

补充:

有人可能会问,cout 能像printf一样指定精度吗?

答案是可以,但是很麻烦,如果有这样的需求,建议直接用printf

因为C语言和C++ 是兼容的,哪个方便用那个就行。

补充:

有人可能会说C语言的printf,scanf比C++的cin,cout快,

确实是这样,因为C++需要对C语言进行兼容和同步,就会比较慢,

不过也有方法能关掉C++对C语言的同步,

如果在一些算法竞赛的话,C语言确实会快,

但是在平时的话,以我们现在电脑的配置,我觉得可以忽略不计。

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

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

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

相关文章

TypeScript 自定义装饰器

&#xff08;预测未来最好的方法就是把它创造出来——尼葛洛庞帝&#xff09; 装饰器 装饰器一种更现代的代码模式&#xff0c;通过使用的形式注入在属性&#xff0c;寄存器&#xff0c;方法&#xff0c;方法参数和类中&#xff0c;比如在Angular&#xff0c;Nestjs和midway等…

百度图像识别 API

首先预览下效果 feaa250077a543a39f037ae8e78a3e80~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp (640594) (byteimg.com) 从以上预览图中可看出&#xff0c;每张图片识别出5条数据&#xff0c;每条数据根据识别度从高往下排&#xff0c;每条数据包含物品名称、识别度…

Redis第十章 Redis HyperLogLog与事务、Redis 7.0前瞻

HyperLogLog HyperLogLog(Hyper[ˈhaɪpə])并不是一种新的数据结构(实际类型为字符串类型)&#xff0c;而是一种基数算法,通过 HyperLogLog 可以利用极小的内存空间完成独立总数的统计&#xff0c;数据集可以是 IP、Email、ID 等。 如果你的页面访问量非常大&#xff0c;比如…

【工具】SecureCR-8.5下载、安装激活和使用教程(包含常用设置)

目录 一、安装包下载 二、安装教程 三、激活操作 四、使用教程 五、常用设置 一、安装包下载 SecureCRT8.5安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1yy677I99ln_3evoHc5dMXg 提取码&#xff1a;9tyj 二、安装教程 1. 解压、双击进行安装 2. 安装进…

oppo r11 升级8.1系统 图文教程

Time: 2023年6月11日13:39:25 By:MemroyErHero 1 预留一定的空间,存放刷机包. 2 导入刷机包 r11.ozip 到手机上 3 手机文件管理器 打开 r11.ozip 文件 4 点击立即更新即可 5 重要的事情说三遍,刷机过程中 不能关机 不能断电 否则会变成砖头 重要的事情说三遍,刷机过程中 …

Java实训日记第一天——2023.6.6

这里写目录标题 一、关于数据库的增删改查总结&#xff1a;五步法1.增2.删3.改4.查 二、设计数据库的步骤第一步&#xff1a;收集信息第二步&#xff1a;标识对象第三步&#xff1a;标识每个实体的属性第四步&#xff1a;标识对象之间的关系 一、关于数据库的增删改查 总结&am…

web worker创建多个 JavaScript 线程 (使用GTP写的文章)

前言 最近在优化公司的一个项目&#xff0c;使用的就是web worker去优化&#xff0c;做了那些优化&#xff0c;一个是状态的优化&#xff0c;&#xff08;通信的状态实时更新&#xff0c;以前的做法是做个定时任务实时获取它的状态&#xff0c;然后让它在页面渲染&#xff0c;这…

Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行触发同步(C#)

Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行触发同步&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和触发同步的技术背景Baumer工业相机使用BGAPISDK进行双相机主从相机触发1.引用合适的类文件2.使用BGAPISDK设置主相机硬件触发从相机…

【C++】一文带你吃透C++多态

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; C/C专栏 &#x1f319;那些看似波澜不惊的日复一日&#xff0c;…

详解WEB集群服务(LNMP+Nginx+Tomcat+Rewrite重写+七层反向代理+SNAT|DNAT策略)

实战项目演练 1.问题描述2.实验操作步骤2.1 CentOS 7-1客户端配置2.2 CentOS 7-2网关服务器配置2.3 CentOS 7-8 (Web1:Tomcat服务器)2.3.1 安装Tomcat服务器2.3.2 提供四层反向代理的动态页面 2.4 CentOS 7-9 (Nginx服务器)2.4.1 安装Nginx服务2.4.2 安装MySQL服务2.4.3 安装配…

算法刷题-哈希表-两数之和

两数之和 1. 两数之和思路总结其他语言版本 1. 两数之和 力扣题目链接 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中…

CSS基础学习--6 CSS Text(文本)

一、文本颜色 color:red; 颜色属性被用来设置文字的颜色。 颜色是通过CSS最经常的指定&#xff1a; 十六进制值 - 如: &#xff03;FF0000一个RGB值 - 如: RGB(255,0,0)颜色的名称 - 如: red body {color:red;} h1 {color:#00ff00;} h2 {color:rgb(255,0,0);} 二、文本的…

无敌!我用【C语言】手搓出了一个体系完整的【员工管理系统】还能玩游戏听音乐?(超详细,附完整源码)

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;C语言程序设计实验项目 如果本文对你有所帮助的话&#xff0c;还希望可以点赞&#x1f44d;收藏&#x1f4c2;支持一下…

【云原生 | 53】Docker三剑客之Docker Compose应用案例一:Web负载均衡

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

React Hook入门小案例 在函数式组件中使用state响应式数据

Hook是react 16.8 新增的特性 是希望在不编写 class的情况下 去操作state和其他react特性 Hook的话 就不建议大家使用class的形式了 当然也可以用 这个他只是不推荐 我们还是先创建一个普通的react项目 我们之前写一个react组件可以这样写 import React from "react&qu…

Java ~ Reference ~ ReferenceQueue【总结】

前言 文章 相关系列&#xff1a;《Java ~ Reference【目录】》&#xff08;持续更新&#xff09;相关系列&#xff1a;《Java ~ Reference ~ ReferenceQueue【源码】》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;相关系列&#xff1a;《Java ~ Reference ~ …

【前端 - CSS】第 9 课 - CSS 初体验

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、CSS 定义 2、基础选择器 3、文字控制属性 4、示例代码 5、总结 1、CSS 定义 层叠样式表&#xff08;Cascading Style …

前端vue地图定位并测算当前定位离目标位置距离

前端vue地图定位并测算当前定位离目标位置距离, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id12974 效果图如下: # #### 使用方法 使用方法 <!-- // 腾讯地图key注册地址&#xff08;针对H5端&#xff0c;manifest.json中web配置&…

触发器和事件自动化的讲解

触发器和事件自动化 一、触发器 1、触发器的基本概念 触发器是和表相关的一种数据库对象&#xff0c;可以将他看作一种特殊的存储过程&#xff0c;不需要人为调动的存储过程。 关键字&#xff1a;trigger 基本作用&#xff1a;通过对表进行数据的插入、更新或删除等操作来触…