转载自以下博主的优秀博客:
https://blog.youkuaiyun.com/cherrydreamsover/article/details/81835976 作者:cherrydreamsover
https://blog.youkuaiyun.com/insistgogo/article/details/6587824 作者:insistGoGo
https://blog.youkuaiyun.com/qq_36782456/article/details/84333149 作者:时光若止-Dale
一、输入输出流
语法区别:
C:使用printf、scanf、 gets、puts等
C++:使用cin、cout
注:c++需加上:
#include<iostream> using namespace std;
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。早些的编码将标准库功能定义在全局空间里(所以并不需要注明使用什么命名空间),声明在带.h后缀的头文件里。C++标准为了和C区别开,也为了正确地使用命名空间,规定头文件不使用后缀.h。因此,当使用<iostream.h>时,相当于在C中调用库函数,使用的是全局命名空间,也就是早期的C++实现。当使用时,该头文件没有定义全局命名空间,必须使用namespace std,指明在哪里的命名空间,这样才能使用类似于cout这样的C++标识符。
优点:
C++使用cin和cout有三个突出优点:
1、简单安全: 根据操作对象自适应的,只需要使用>>或者<<就可以搞定一切
2、支持用户自定义类型的流操作: 需要重载<<运算符
注意事项:
1、要使用头文件iostream。cout和cin并不是C++语言中提供的语句,它们是iostream类的对象,故使用的时候必须加上头文件iostream,又因为cout是std名字空间中定义的全局对象,在main函数执行前就已经构造好了,只管用就是,而不用在定义对象等操作。
2、二者效率不同。至于printf和cout那个快,根据数据不同,会有不同的结果。但是百度上说做ZOJ时,使用cout会有超时的情况,这个要注意。
3、不同类的输入输出语句不能混合使用。cin和cout搭配使用,printf和scanf搭配使用。因为运行机制不同,混合使用可能会出问题。
常用语法:
cin>>变量/指针;
1、数据流向谁就指向谁。(记忆)(键盘->内存)
2、变量可以是一个也可以是多个,数据之间可以使用空格、Tab或回车分开
cin>>a>>b
cout<<变量/常量(各种类型常量);
1、 数据流向谁就指向谁。(内存->显示器)
2、 变量可以是一个、多个、也可以是表达式
cout<<a<<b<<a+b;
cout<<endl;
#include <iostream.h>
#include <stdio.h>
void main()
{
printf("A\n");
cout<< "B\n";
printf("C\n");
}
输出结果:
A
C
B
#include <iostream.h>
#include <stdio.h>
void main()
{
printf("A\n");
cout<< "B"<<endl;
printf("C\n");
}
输出结果:
A
B
C
原因:printf不使用缓冲,输入时直接输出到终端,但是cout使用流,有缓冲输出,总是在强制刷新或程序结束后才能显示结果。
cout < < "abc " < <endl; 等价于 cout < < "abc\n ";cout < <flush; (flush使立即强迫缓冲输出)
endl相当于输出回车后,再强迫缓冲输出,包含flush的作用。
通过cout分步执行可以看到,执行cout<< "B\n "时(这里没使用endl或刷新)无内容立即输出,一直到程序而执行cout<< "B"<<endl;时有结果输出。
则cout分步执行时,到程序结束时或使用endl才输出结果到屏幕 而 printf每步运行都有结果输出,有利于调试。
因此,调试的时候,语句中含有cout < < "abc "这种的时候,要加上endl或改成 printf 语句。
二、面向过程和面向对象
C语言进行过程化、抽象化的通用程序设计。
C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
(1)面向过程:面向过程编程就是分析出解决问题的步骤,然后把这些步骤一步一步的实现,使用的时候一个一个的依次调用就可以了。
(2)面向对象:面向对象编程就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。
举个例子:(玩五子棋)
(1)用面向过程的思想来考虑就是:开始游戏,白子先走,绘制画面,判断输赢,轮到黑子,绘制画面,判断输赢,重复前面的过程,输出最终结果。
(2)用面向对象的思想来考虑就是:黑白双方(两者的行为是一样的)、棋盘系统(负责绘制画面)、规定系统(规定输赢、犯规等)、输出系统(输出赢家)。
面向对象就是高度实物抽象化(功能划分)、面向过程就是自顶向下的编程(步骤划分)
面向过程和面向对象的优缺点
在学习一些比较抽象的概念时,由于我们的理解能力很有限,有时候一些比较恰当的例子也是有助于我们学习的,因此对二者的优缺点比较,还是先举例子,后总结吧!
(1)用面向过程写出来的程序就像一份蛋炒饭,也就是米饭和炒的菜均匀的混合在了一起,因此蛋炒饭入味均匀,不会像盖浇饭那样,可能有时候吃的菜多饭少,还有时候菜少饭多。但是如果你不喜欢吃蛋炒饭,只想吃肉炒饭,那么原来做的这份蛋炒饭就得倒掉了,重新做一份肉炒饭,厨师就得辛苦了!
(2)用面向对象写出来的程序就像一份盖浇饭,也就是米饭和盖菜分别做好,将盖菜放在米饭上面,盖浇饭虽然没有蛋炒饭那样入味均匀,但是如果给了你一份土豆丝盖饭,你又不想吃了,换成牛肉盖饭,厨师只需要将米饭上面的土豆丝倒掉,重新做一份牛肉放在上面就好了。
那么到底蛋炒饭和盖浇饭哪个好吃呢?
我觉得各有优劣,谁也不能说到底哪个好,毕竟蛋炒饭的餐馆和盖浇饭的餐馆都很多,而且生意都很不错,存在即为合理!
如果非要将二者进行一个高地的比较的话,那就得先设定一个场景了!
盖浇饭的好处就是”菜”“饭”分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用专业术语来说就是”可维护性“较好,”饭” 和”菜”的耦合度比较低。
蛋炒饭将”蛋”“饭”搅和在一起,想换”蛋”“饭”中任何一种都很困难,耦合度很高,以至于”可维护性”比较差。 但是运行速度较快。
基于上述的例子,二者的优劣总结如下:
- 面向过程语言
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
- 面向对象语言:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低
三、关键字
- C99有32个关键字
- C++98有63个关键字
一些关键字的细微区别:
(1)struct:在C语言中struct定义的变量中不能有函数,而在C++中可以有函数。
(2)malloc :malloc函数的返回值为void*,在C语言中可以赋值给任意类型的指针,在C++中必须强制类型转换,否则报错。
(3)struct和class:class是对struct的扩展,struct默认的访问权限是public,而class默认的访问权限是private。
四、返回值
C语言中,如果一个函数没有指定返回值类型,默认返回int类型;C++中,如果一个函数没有返回值则必须指定为void。
五、参数列表
在C语言中,函数没有指定参数列表时,默认可以接收任意多个参数;但在C++中,因为严格的参数类型检测,没有参数列表的函数,默认为 void,不接收任何参数。
六、缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的参。(C语言不支持缺省参数)
(1)半缺省参数
void FunTest(int _iParam1, int _iParam2 = 0 )
{}
void FunTest(int _iParam1, int _iParam2 = 0 , int _iParam3/* = 0*/)
{}
void FunTest(int _iParam1, int _iParam2 /* = 0*/,int _iParam3 = 0)
{}
(2)全缺省参数
void FunTest(int _iParam1 = 0, int _iParam = 1)
{ }
//注意:慎用缺省函数,否则会产生二义性
void FunTest ()
{}
void FunTest (int a = 10 )
{}
//假如使用不带实参方式调用FunTest()函数时,编译器将不知道调用哪一个,产生二义性
注意:
(1)在半缺省的情况下,带缺省值的参数必须放在参数列表的最后面。
(2)缺省参数不能同时在函数的声明和函数定义中出现,二者只能选其一。
(3)缺省值必须是常量或者全局变量。
(4)缺省参数必须通过值参或常参传递。
七、函数重载
函数重载:函数重载是函数的一种特殊情况,指在同一作用域中,声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须不同,返回值类型可以相同也可以不同,常用来处理实现功能类似数据类型不同的问题。(C语言没有函数重载,C++支持函数重载)。
来看个例子:
//下面两个函数算函数重载吗?
void FunTest6()
{ } int
FunTest6()
{
return 0;
}
//答案是不能,因为仅仅返回值类型不同,不能构成重载