?
? ? ? ? 本篇文章针对有一定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的强大与魅力。
?
?
?
? ? ? ? 在这里你是不是闻到了熟悉的味道——在我们刚刚接触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,怎么舒服怎么来。?
?
完~?
未经作者同意禁止转载