【C->Cpp】深度过渡由C迈向Cpp(1)

发布时间:2023年12月20日

?

? ? ? ? 本篇文章针对有一定C语言基础的读者,如果你有一定的C语言基础,那么你可能会对本文有更好的理解。

?

? ?????????C->Cpp(由C迈向Cpp)这个栏目,就是在为Cpp的学习打下坚实的基础。

?

C与Cpp有什么关系呢??具体来说:

?

? ? ? ? Cpp包含了C的绝大部分语法,也就是说Cpp兼容C的大部分语法。

? ? ? ? ????????(<iostream.h>这个头文件兼具<stdio.h>这个头文件的作用,这就是众多例子中的一个)

? ? ? ? Cpp针对C的缺陷,在C的基础上增加了许多用法和规则。

? ? ? ? ? ? ? ? (仅从关键字上,Cpp就比C多了一倍,这也是一个例子)

????????当然,这只是我的个人理解,并不能涵盖Cpp对于C的改进的良苦用心,希望你能在学习中感受到Cpp的强大与魅力。

?

?

(一)第一个Cpp程序

?

? ? ? ? 在这里你是不是闻到了熟悉的味道——在我们刚刚接触C语言的时候,似乎也是以第一个C语言程序开始的。

#include<stdio.h>
int main()
{
    printf("hello world\n");

    return 0;
}

????????说实话,还是有些感慨的:

? ? ? ? 从一个到另一个,长长的路,慢慢的走。


?

?


?

? ? ? ? ?既然要认识Cpp,当然离不开第一个Cpp程序:

?
#include<iostream>
using namespace std;
int main()
{
    cout << "hello world\n" << endl;

    return 0;
}

?

?这两个简单的程序的作用是一样的,从这两个程序的对比中,我们们可以发现:

? ? ? ? cpp的头文件,头文件下方的一句代码,标准输出打印完全不同与C,在这里,我们就不得不引入一些新的概念了,这些概念的引入,是有原因的。

?

? ? ? ? ?其实,原因是显而易见的:

????????????????Cpp在构建自己的大厦之前,必须先要补一补C语言的不足,引入这些概念的核心目的是为了解决C的一些不足。

? ? ? ?


?

(二)命名空间?

我们先考虑两个场景。


?? ? ? ? ?场景一:

? ? ? ? 我们编译下方的代码,却发现报错了

#include<stdio.h>
#include<stdlib.h>
int rand = 0;
int main()
{
	printf("%d",rand);
	return 0;
}


?

? ? ? ? 场景二:

? ? ? ? 假设,你与同事合作共同进行一个项目的代码的编写,?你们分别完成不同的模块,但不幸的是,你们缺乏沟通,结果导致你们的模块在组合后出现了命名冲突。

?


?名字冲突:

? ? ? ? 我们自己定义和库里面的名字冲突;

? ? ? ? 项目组,多个人之间的名字冲突。

? ? ? ? 这样的错误在C语言中是无法挽回的,唯一的办法只有一人妥协,改掉冲突的名字,但是这很费工夫。

?

? ? ? ? ?C语言中有域的概念,域又分为局部域和全局域;在局部域里面的变量是局部变量,在全局域的变量是全局变量。对于同名变量,在局部域内部优先使用全局变量,这是已知的C语言的知识。其实也是C语言在解决同名问题的一个规定。

?

? ? ? ? 在Cpp中,你可以忽略局部域内部定义的变量a,正常使用定义在全局域的一个重名的变量a。我们引入域作用限定符(::);

? ? ? ? :: 操作符左侧是特定的域,右侧是变量。?

? ? ? ? 它的作用是在操作符左侧的域中寻找操作符右侧的变量。


?

#include<iostream>
int a = 10;
int main()
{
	
	int a = 1;
	printf("%d\n",a);//在默认情况下,优先使用全局变量a = 10;
	printf("%d\n",::a);//在域作用符左侧不写任何域,表示在全局域中找变量a = 1;
	return 0;
}

?

?::左侧不写任何内容,表示在全局去找变量a


?????????Cpp对于重命名的局部和全局变量,用::操作符来解决冲突,而C回避了这一问题。

????????这就是Cpp相对于C的优势。

? ? ? ? 命名空间就是与此相似:

????????命名空间——命名空间域,只影响使用,不影响生命周期。


?

?命名空间把两个重名的对象放在了两个不同的域中,这样就不存在重名的问题了;

? ? ? ? 那么,最需要的时候,如何从命名空间中找的需要的变量呢?

? ? ? ? 有三种方法:?

1.在整个命名空间中找,对应的代码是:

using namespace std;

2.提前把需要的找出来,代码如下:

//比如说,需要cout 和 endl;
//就可以提前把这两个的定义找出来

using std::cout;
using std::endl;

?3.什么时候使用什么时候再找,代码:

//比如我们要打印hello world;
//在使用cout 和endl的时候在找出来;

std::cout << "hello world" << std::endl;

????????第一种用法对应的是——全局展开;后两种用法对应的是——指定命名空间访问。

?????????一般是不建议全局展开的,一旦全局展开,你定义对象的时候,必须避开可能重名的可能。这样就白费了Cpp的命名空间这一功能的苦心了。

?

? ? ? ? ?当两个人的代码中定义有重名的函数,变量等时,可以把两个人的变量,函数等分别放在两个命名空间中,在需要使用的时候再拿出来,就解决了命名冲突的问题。

?


?(三)输入输出流

?

Cpp中的I/O流是用于输入和输出数据的机制。它允许程序通过不同的设备(如键盘、屏幕、文件等)与外部环境进行交互。

?

Cpp中的I/O流分为两种类型:输入流和输出流。

输入流用于从外部设备读取数据,输出流用于向外部设备写入数据。

Cpp中的I/O流库提供了多个流类,每个流类都有相应的成员函数和操作符重载,用于实现对流的操作。

?

在初始阶段,我们先理解

cout << "hello world\n" << endl;

?这段代码是不是就像一个河流,<< << 表示流向;endl其实就是‘\n’;

?

? ? ? ? cout的优势是自动识别数据类型,与printf不同,printf需要由一定的格式符 “%d”等,但是cout可以自动识别类型。

#include<iostream>


int main()
{
	int a = 40;
	std::cout << "hello wrold" << std::endl;
	std::cout << "   "<< "heomk " << 'd' << " "<< a << std::endl;
	float b = 8.6;
	double c = 5.9;
	std::cout << b << "  " << c << std::endl;
	
	return 0;
}

?

?

printf:

? ? ? ? 需要指定格式,可以一个次操作打印多个类型;

printf("%d%c%f%lf",(int)a,(char)b,(float)c,(double)d);

cout:

? ? ? ? 自动识别格式,但只能一次打印一种类型。

? ? ? ? ? ? ? ? (两个<< << 之间只能写一种数据类型:)

std::cout << "   "<< "heomk " << 'd' << " "<< a << std::endl;

他们各有优势。

????????重要的是Cpp可以兼容C。

????????其实,在我看来,我们完全可以按照自己的意愿,选择使用cout与printf,怎么舒服怎么来。?

?


完~?

未经作者同意禁止转载

文章来源:https://blog.csdn.net/2301_79465388/article/details/135101806
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。