C++(1)——入门

前言

        从今天开始,我将带大家来一起学习C++,不管你是零基础的编程小白,想找一门实用语言打下扎实基础;还是有 Python、Java 基础,想深入底层原理、提升性能把控力;又或是学生党要应对课程作业,职场人需补充技能短板 —— 这个系列都能适配你的节奏。

        学习编程没有捷径,C++ 更是需要多敲代码、多踩坑才能掌握。但没关系,我会陪着大家慢慢走,每篇文章都会把重点讲透,也欢迎大家在评论区分享疑问、交流心得。

        接下来,就让我们一起开启这段 C++ 学习之旅,从 0 到 1,逐步解锁编程的硬核力量~

C++入门(1)

本节知识点安排目的

        首先我们要了解到的是,C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式 等。那么本章节主要目标为:

1. 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用

域方面、IO方面、函数方面、指针方面、宏方面等。

2. 为后续类和对象学习打基础。

1. C++关键字(C++98)

C++总计63个关键字,C语言32个关键字

ps:下面我们只是看一下C++有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再

细讲。

2. 命名空间

  我们先来看以下代码:

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

int rand = 10;

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

        当我们运行这段代码时,我们会发现系统报错了,这是因为这里发生了重定义的冲突,即我们定义的rand变量与stdilb中的rand函数发生了冲突。由此我们能够发现,C语言其实是存在命名冲突的问题。那么这时候关键字 namespace 就要发挥它的作用了。

 在这里我们要先引入这个概念。包括类域命名空间域局部域全局域等

int a = 0;

int main()
{
    int a = 1;

    printf("%d\n", a);
}

如上面代码所示,第一个a变量就是存在于全局域,第二个a变量就存在于局部域。

ps:这里我们只对这两个域做个简单介绍,剩下的我们后续学习到时会详细讲解。

我们知道,因为局部优先,此时我们输出a默认访问的是局部域中的a,那么现在请大家思考一个问题:如何访问全局域?

这时候我们就要用到域作用限定符  :: 

printf("%d",::a);

当 :: 的左边是空白,就代表着访问的是全局域。

int a = 0;    //全局域

namespace bit    //命名为bit
{
	int a = 1;    //命名空间域
}

int main()
{
	int a = 2;    //局部域
	printf("%d\n", a);
}

在上面这段代码中,变量a访问的优先级是:局部域 -> 全局域 -> 展开了命名空间域 or 指定访问命名空间域。

using namespace bit;

这个就叫做展开命名空间。当没有这条语句时,也就没有展开命名空间,编译时也就不会去命名空间中搜索。注意:展开命名空间相当于将这部分空间暴露到全局,因此全局域和展开的命名空间中不能出现同一个变量。因此,不要轻易展开命名空间

上述的展开是全部展开,除此之外我们还可以部分展开

using bit::a;

像这样就能把 bit 这个域中的a变量给展开了,从而避免了其它变量与 bit 中的变量发生冲突。

printf("%d",bit::a);

这条语句就是指定访问命名空间域,即在::前加上域名 bit。

这时我们再回到开头,如何解决rand冲突的问题?

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

namespace bit
{
	int rand = 1;
}

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

那么像这样,我们就能轻松解决该问题啦。

接下来我们还要了解到:

1.命名空间中不仅可以定义变量,还可以定义函数、类型。比如:

namespace bit
{
 // 命名空间中可以定义变量/函数/类型
    int a = 0;
    int b = 1;
    int Add(int left, int right)
    {
        return left + right;
    }

    struct Node
    {
        struct Node* next;
        int val;
    };
}

2.命名空间可以嵌套,比如:

namespace N1
{
    int a = 0;
    int b;
    int Add(int left, int right)
    {
        return left + right;
    }

    namespace N2
    {
        int a = 1;
        int c;
        int Sub(int left, int right)
        {
            return left - right;
        }
    }
}

而对于嵌套中的命名空间,我们是这样访问的:

printf("%d",N1::N2::a);

3.多个同名的命名空间最后会被合并为同一个空间

3.C++输入&输出

ps:这里只做简单解释

#include<iostream>

using namespace std;

int main()
{
    int a;

	cout << "hello world" << endl;
    cin >> a ;
}

这是一段简单的输出代码,接下来我会带你逐步解析这段代码

#include<iostream>

首先,这是在输入输出时所需要包含的头文件IO流。你可以暂时把它简单理解为c语言中的<stdio.h>。

using namespace std;

这个我们知道是在展开std这个命名空间,这里的std其实就是标准库。那么有了这条代码,我们就可以使用下面的 cout endl

cout << "hello world" << endl;

在这段代码中,首先我们先可以把 cout 理解为一个对象或者是我们的屏幕。

 <<    这个是一个运算符,叫做流插入运算符,它的作用就是将它右边的内容插入到左边的对象当中

endl    它的作用其实就相当于 \n ,是用来换行的。

总的可以理解为,在cout中插入一个"hello world",再在"hello world"后面插入一个换行符。这就是一个简单的输出语句。

值得注意的是,cout的一大特点就是它能够自动识别类型。

 cin >> a ;

这里可以把 cin 理解为我们的键盘。

>>     这也是一个运算符,叫做流提取运算符,那么它的作用就是将它左边的内容读取到右边

所以这段代码也就意味这从键盘上读取数据到变量a中

同样,cin也能够自动识别类型。

但是,需要注意的是,cin在读取小数时,精度可能会发生变化。虽然我们可以去指定它的精度(包括cout打印的格式等),但是会十分麻烦,这里就不做过多解释,好奇的同学们可以自己去了解一下。

这里顺便提一嘴:在大量的输入输出时,scanfprintf会比cincout速度更快,原因是不管是C++还是C语言IO都是有缓冲区的,而C++的IO流需要去兼容同步C语言,在输出时需要去检查C语言的缓冲区内有没有内容,所以导致速度较慢。当然也有方法把这个同步关掉,这里就不做讲解了。

        到这里C++入门(1)的学习就结束了,希望同学们一定要去多敲代码实操巩固。下一节,我们会继续深入 C++ 的核心语法,解锁更多优化特性和实用技巧。如果大家在练习中遇到问题,或者有想补充的知识点,欢迎在评论区留言交流~ 关注我,一起稳步推进 C++ 学习之旅,咱们下次见!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值