从C到C++过渡知识上

C++简介

        C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的 程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机 界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言 应运而生。 1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一 种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而 产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的 程序设计,还可以进行面向对象的程序设计。

        简单来说C++就是在C语言的基础上进行进行改进的,引入了新的规则与关键字,同时又支持98%~99%的C语言语法。

        下面是C++之父Bjarne Stroustrup,作为C++程序员都要感谢祖师爷赏饭吃。

        接下来我们来看些C过渡到C++要了解的知识

命名空间

        这个知识主要是关于作用域的改进,下面我们来看段对比代码。

        左边的代码我们定义了一个全局变量rand,在main中打印,程序成功运行,而右边代码仅仅添加了一个头文件#include<stdlib.h>便报错。这是为什么呢?

        原来是应为引入头文件的时候,头文件在预处理的时候会将里面的内容展开,而在stdlib.h标准库中有rand()函数求随机值。于是才有了重定义的错误。

        我们这里仅仅是举了一个小程序的例子,不管我们学习C++还是C语言,最终我们是一定要用于实战的,在公司项目中我们也不可能一个人单独写代码,一定是不同的人合作写一个代码。那么不同的人取得变量名,函数名便可能相同,但在C语言中同一个变量只能定义一次,由此在实际编程中便可能产生命名冲突。

        我们的C++之父面对这一困境在C++之中引入了命名空间的概念。

        下面我们看下他的语法规则

语法

        在这里我们要学习C++第一个关键字namespace ,它用于规定一个命名空间

namespace my
{
	int rand = 0;
}

        他的语法与我们C语言的结构体十分的相似,但注意namespace花括号最后没有分号,namespace 关键字后面的是命名空间名字,取名规则与C语言变量取名规则一样,只能由数字字母下划线组成,且第一个不能是数字。

        对于结构体内的数据我们可以采用 my.a用点来访问,对于命名空间的成员我们要采用作用域限定符::来访问,例如my::rand。

        由此我们便可以解决这种方法解决上面命名冲突的问题。

        对于单个的输出我们可以一个个的添加作用域限定符,但如果遇到下面的代码

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

        我们需要在每个t前面加::十分麻烦,于是我们便可以用using关键字。将命名空间展开,这样我们就可以免于写多个::了。

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

        细心的读者一定发现我在上面的代码中将rand换成了t,这是因为如果我们变量名为rand,又使用using展开了,那么编译器就不会知道rand到底指变量还是函数,便会有如下错误。

输入输出

        了解一门新的语言,大多数人首先想的便是利用这门语言的语法打印Hello world!当然也可以打印其他的东西。只要你学过C语言便可以在C++编译器中用C的语法打印。当然C++还有新添的输入输出函数。下面我们来看看。

cout

        在使用cout函数前,我们要引入C++标准输入输出库<iostream>,但是光有头文件还不可以,

为了方便我们还要加上using namespace std;这是C++之父为了防止我们自定义函数与库函数终于,将头文件的函数包含在std命名空间中.当然我们也可以使用std::cout输出。

        下面我们看段代码。

        cout的输出十分简单,他会自动的帮我们识别变量的类型而不需要我们手动的格式化输出。

如果用printf我们可以如下写。

        可以看出cout简化了我们程序员的操作,不需要考虑类型,只需要将想要的输出即可。但简化我们的操作同时它必然省略了许多细节。例如我们要输出一个小数。

        它默认我们有几位就输出,做不到printf格式化输出指定个数。当然C++也提供了改变输出模式的方法,

std::left : 左对齐 ;
std::right : 右对齐 ;
std::internal : 内部对齐 ;
std::dec : 使用十进制数 ;
std::hex : 使用十六进制数 ;
std::oct : 使用 八进制数 ;
std::showbase : 显示符号或前缀 ;
std::showpoint : 显示小数点后的 0 ;
std::showpos : 显示正号 ;
std::fixed : 固定精度 ;
std::scientific : 科学计数法 ;

        这里仅举出几个,在这里我推荐大家对输出要求严格的话就用printf,不严格就用cout。可以两者混合搭配使用。减小些记忆负担。

cin

        cin与cout类似,也可以自动的识别类型,下面我们看段代码。

       假如我们使用scanf就会麻烦一点。如下

        它不用像scanf那样取地址显得麻烦,十分简单。当然鱼与熊掌不可兼得,它也难以做到格式输入,指定输入个数,但对于普通的输入我们用cin便完全可以了。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-03 07:20:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-03 07:20:05       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-03 07:20:05       82 阅读
  4. Python语言-面向对象

    2024-04-03 07:20:05       91 阅读

热门阅读

  1. SpringBoot -- Profiles

    2024-04-03 07:20:05       41 阅读
  2. Vue项目动态加载图片

    2024-04-03 07:20:05       38 阅读
  3. 若依框架:登陆(后端)

    2024-04-03 07:20:05       39 阅读
  4. 494. 目标和(力扣LeetCode)

    2024-04-03 07:20:05       41 阅读
  5. wpf Ellipse

    2024-04-03 07:20:05       33 阅读
  6. 小参林八股

    2024-04-03 07:20:05       33 阅读
  7. notepad++ 快捷键使用

    2024-04-03 07:20:05       44 阅读
  8. vim脚本的语言语法

    2024-04-03 07:20:05       37 阅读
  9. 微前端qiankun接入Vue和React项目

    2024-04-03 07:20:05       37 阅读
  10. JVM将虚拟机分成了哪几块区域?

    2024-04-03 07:20:05       33 阅读
  11. nginx报错相关问题

    2024-04-03 07:20:05       32 阅读