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

news2024/10/9 6:21:45

写在前面

欢迎来到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语言确实会快,

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

写在最后:

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mac配置iterm2

1、iTerm2 - macOS Terminal Replacement 下载 2、设置默认 3、配置主题theme 这里选择用Solarized Dark theme&#xff0c;下载地址&#xff1a;http://ethanschoonover.com/solarized&#xff0c;解压。 我这里失效了&#xff0c;选择从github上下载Solarized Dark这个主题…

拼图游戏-第14届蓝桥杯国赛Scratch真题初中级组第5题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第147讲。 拼图游戏&#xff0c;本题是2023年5月28日上午举行的第14届蓝桥杯国赛Scratch图形化编程初中级组真题第5题&…

国产Gauss 分布式数据库概述

一、前言 GaussDB 是华为2023年6月7日发布新一代分布式数据库&#xff0c;采用share-nothing架构&#xff0c;数据自动分片&#xff0c;通过GTM-Lite技术实现事务强一致&#xff0c;无中心节点性能瓶颈&#xff0c;是华为基于openGauss自主创新研发的一款分布式关系型数据库&am…

spark的使用

国内源下载 https://mirrors.cloud.tencent.com/apache/spark/ 环境配置(三台机器都要配置) 修改/etc/profile export JAVA_HOME/export/server/jdk export HADOOP_HOME/export/server/hadoopexport SPARK_HOME/export/server/spark export PYSPARK_PYTHON/pythonenv/pyspark…

苹果MR Vision Pro将会带动哪些零部件出货?

苹果如何重新定义AR? 在如今以智能手机为主的消费电子市场下行阶段&#xff0c;市场急需开辟一个新的领域带来新的增长点&#xff0c;以往被寄予厚望的VR/AR等头显设备在经历了数年发展后&#xff0c;依旧难堪大任&#xff0c;业界都把希望寄托在苹果身上。 简单来说&#xf…

学习Java一年的程序员的Python学习记录(转行了,校招Java根本找不到工作)

文章目录 一 基础语法二 集合三 函数四 IO五 项目结构六 面向对象 一 基础语法 Python如果是部署在Linux上&#xff0c;是需要通过源码去编译安装的&#xff0c;在编译的过程中&#xff0c;会以来一些第三方的软件。所以这些软件需要提前安装一下。 yum install wget zlib-deve…

VS报错集锦 --- 出现:error LNK2005: _DllMain@12 已经在 *****.obj 中定义 错误

出现的问题&#xff1a; 1>mfcs140d.lib(dllmodul.obj) : error LNK2005: DllMain 已经在 DllMain.obj 中定义 解决方法&#xff1a; 项目 -- 属性 -- c/c -- 预处理器 -- 将预处理定义中的_USRDLL 删除即可

“大四在读生”都四面成功拿到字节跳动Offer了,你还有什么理由去摸鱼?

博主大四在读&#xff0c;投的是字节 Data 的软件测试岗位实习生&#xff0c;base 杭州。 时间线&#xff1a; 4.12 投递4.13 安排简历筛选4.14 安排面试4.19 16:00 一面4.22 16:00 二面 4.23 8:00 三面4.23 16:00 HR 面4.23 16:30 Offer 一面 你对字节跳动的了解和认知有哪…

Allegro16.6详细教程(四)

(2) PIN的定義 如果用第一種方式產生Netlist的話,就要對於一些Power pin加以定義。 1.滑鼠點選想定義的零件。 2.點選選單中Edit>Part。 3.用滑鼠點選想定義的Pin腳。 4.點選功能表中Edit>Properties,透過這些步驟就看到了下面的這個對話方塊了。 在這裏主要是把T…

Apache Flink 1.17

Apache Flink 1.17 1. Flink 1.17 Overview2. Flink 1.17 Overall Story3. Flink 1.17 Key Features4. Summary5. Q&A 1. Flink 1.17 Overview Flink 1.17 版本完成了 7 个 FLIP&#xff0c;累计贡献者 170&#xff0c;解决 600Issue 以及 1100Commits&#xff0c;整体来看…

ppt如何录屏?电脑怎么录制ppt文稿?

案例&#xff1a;在电脑上怎么录制PPT文稿&#xff0c;具体怎么操作&#xff1f; 【我工作的时候经常需要用到ppt文稿&#xff0c;有时还需要对PPT文稿进行录制&#xff0c;但我不知道如何操作。有小伙伴知道在电脑上如何录制ppt文稿吗&#xff1f;需要用到什么工具&#xff1…

热水器语音芯片,带有温度检测算法、数码管显示语音ic,WTV380

在现代科技不断进步的时代&#xff0c;智能家居产品成为越来越多消费者的选择&#xff0c;在热水器行业为了提供更智能、便捷的用户交互体验&#xff0c;一款带有数码管显示语音提示二合一&#xff0c;多功能语音芯片方案 —— WTV380 WTV380能够实现语音播报热水器的各种信息…

学PCB设计要精通模电吗?

PCB设计是电子工程师在电路设计领域中的重要一环&#xff0c;而模拟电路设计&#xff08;简称&#xff1a;模电&#xff09;是其中的核心内容之一&#xff0c;很多小白在初学PCB设计都会困惑&#xff0c;学PCB设计是否要精通模电&#xff1f;这篇文或许能解惑&#xff0c;本文将…

【LeetCode热题100】打卡第16天:组合总和

文章目录 组合总和⛅前言&#x1f512;题目&#x1f511;题解 组合总和 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数…

Vue.js 中的 $router 和 $route

Vue.js 中的 $router 和 $route 在 Vue.js 中&#xff0c;$router 和 $route 是两个常用的对象&#xff0c;用于处理路由相关的操作。在本文中&#xff0c;我们将介绍 $router 和 $route 的区别&#xff0c;并且演示如何使用它们。 $router 和 $route 的区别 在 Vue.js 中&am…

Windows 下挂载使用 CephFS

一、Ceph集群搭建和CephFS创建 参考上期文章 Centos stream 8 使用 cephadm 安装 Ceph (17.2.6 quincy)集群_阿波罗.2012的博客-CSDN博客 二、将CephFS挂载到Windows Server 2019下 1、准备Dokany 下载地址&#xff1a;Release 1.5.1.1000 dokan-dev/dokany GitHub 下载…

【数据分享】1929-2022年全球站点的逐年平均降水量(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;说到常用的降水数据&#xff0c;最详细的降水数据是具体到气象监测站点的降水数据&#xff01; 之前我们分享过1929-2022年全球气象站点的逐年平均气温数据、逐年最高…

实用工具篇(三):一款 IntelliJ IDEA 神级插件Bito

目录 1、什么是Bito 2、为什么要使用Bito 3、如何安装Bito插件 4、如何使用Bito插件 1、什么是Bito Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。 Bito插件的强大…

Clion开发STM32之ESP8266系列(一)

系列开篇说明 结合个人的开发经验以及实际情况&#xff0c;分享stm32结合esp8266的一个开发项目。从0开始构建项目程序。为了方便记录项目开发记录&#xff0c;此系列的每个篇章都在git上做一个节点。此系列也是作为一个个人的开发思路和经验本次开发选用的芯片为stm32f103vet…

GIT安装教程(入门)

目录 前言 Git作者 官网 GIT优点 GIT缺点 为什么要使用 Git 下载以及安装步骤 一、官网下载 二、GIT安装步骤 GIT习题 习题一 总结 前言 Git 是一个分布式版本控制及源代码管理工具;Git 可以为你的项目保存若干快照&#xff0c;以此来对整个项目进行版本管理 Git作…