从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 ,它用于规定一个命名空间

cpp 复制代码
namespace my
{
	int rand = 0;
}

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

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

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

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

cpp 复制代码
#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关键字。将命名空间展开,这样我们就可以免于写多个::了。

cpp 复制代码
#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便完全可以了。

相关推荐
一点媛艺17 分钟前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风21 分钟前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生1 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功1 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨1 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程2 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
UestcXiye3 小时前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp
Chrikk3 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*3 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue3 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang