C++对C语法的差异/扩充
C语言是面向过程的编程思想,面向过程的程序设计(Procedure-Oriented Programming,简记为POP)
C语言中:程序 = 数据结构 + 算法
C++是面向对象的编程思想,面向对象程序设计(Object Oriented Programming,OOP)
C++中:
对象= 数据结构 + 算法
程序 = (对象 + 对象 + … + 对象) + 对象间通信机制
面向对象程序设计 OOP
面向对象程序设计(Object Oriented Programming,OOP)是一种计算机编程架构。OOP的一条基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。
OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。
OOP=对象 + 类 + 继承 + 多态 + 消息,其中核心概念是类和对象。
一切事物皆对象。将现实生活中的事物及其关系抽象成类,通过继承,实现,组合等的方式,实现对现实世界的抽象和数学建模。面向对象编程更符合人类的思维模式。
(1)面向对象的三大特性:
-
封装
隐藏对象的属性和实现细节,对外仅提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。 -
继承
提高代码复用性;继承是多态的前提。 -
多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。
(2)五大基本原则:
-
单一职责原则SRP (Single Responsibility Principle)
类的功能要单一,不能包罗万象,跟杂货铺似的。 -
开放封闭原则OCP (Open-Close Principle)
一个模块对于拓展是开放的,对于修改是封闭的。
eg:想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。 -
里式替换原则LSP (the Liskov Substitution Principle LSP)
子类可以替换父类出现在父类能够出现的任何地方。
eg:你能代表你爸去你姥姥家干活。 -
依赖倒置原则DIP (the Dependency Inversion Principle DIP)
高层次模块不应该依赖于低层次模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
eg:比如你出国要说你是中国人,而不能说你是具体哪个村子的。比如说中国人是抽象的,下面有具体的xx省,xx市,xx县。你要依赖的是抽象的中国人,而不是你是xx村的。 -
接口分离原则ISP (the Interface Segregation Principle ISP)
设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。
eg:比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。
参考链接:https://www.jianshu.com/p/7a5b0043b035
C++ 程序基本结构
#include <iostream>//头文件:标准输入输出流
using namespace std;//名字空间
int main(int argc, char * argv[])//主函数入口
{
cout << "hello world!" << endl;//函数体:向终端输出"hello world!"
return 0;//函数返回值
}
C++ 源码文件扩展名和头文件命令规则
C++中,
(1)常用的源码文件扩展名(后缀):cpp / cc
(2)引用头文件命令规则:新规则是不再带.h扩展名
C++ 程序编译流程
(1)C++中,常用的编译器:linux/g++
-
gcc编译时链接一般默认的是glibc库
g++编译时链接一般默认的是stdc++库
gcc demo.cc/cpp -lstdc++ <-等价于-> g++ demo.cc/cpp -
C++编译融合了三种方式:
1)C语法的面向过程编译
2)C++基于C语法扩展的面向对象编译
3)C++模板支持的泛型编译
(2)C++中,编译的流程和C语言编译基本一样:
- 预处理(g++ -E demo.cpp -o demo.i)
头文件展开,宏定义替换,删除注释;
不能做定义,只能做声明; - 编译(g++ -S demo.i -o demo.s)
- 汇编(g++ -c demo.s -o demo.o)
- 链接(g++ demo.o -o demo -lc++库)
C和C++的差异
(1)语法差异
- C语言中的隐式声明、指针访问时段错误等,在C语言中,gcc编译只会报警告warning
但是在C++中,g++编译时直接报错误error。 - 二义性:C语言中编译器不会对重名的全局变量进行报错,但是C++会。
- C语言中变量的定义必须在作用域开始的位置定义,而c++所有变量都可以在使用时直接定义,不用考虑位置。
(2)常变量const 差异
C语言,const变量是只读变量。
C++中,const修饰的是真正意义上的常量。
注意:C语言中,只有枚举enum定义的才是真正意义上的常量。
(3)强制类型转换差异
int i = 0;
char ch = (int)i; C语言风格
Char ch = char(i); c++风格
(4)struct关键字差异
C语言中,struct标识符并不认为是定义了一个新的类型,而认为是一组变量的集合;
C语言要想struct定义为一个新的类型必须用typedef关键字重定义。
而c++中,struct则认为是一种新的类型。
相同点:语法的程序都和之前一致。
struct student
{
const char * name;
int age;
}
int void(int argc, char * argv[])
{
student s1 = {"zhang san", 22};在C++中struct标识符修饰student就代表一种新的类型,可以直接使用
但是在c语言中,不可直接使用,必须typedef后才能使用。
return 0;
}
(5)int func() 和 int func(void) 的区别
区别:要看用什么编译器,C和C++编译器不同。
(6)bool类型
c语言中,没对应的基本类型来代表bool类型,而是用int整型代替bool的真为1,假为0;
c++在基本类型的基础上,增添了bool类型,取值只有true(编译器:1)和false(编译器:0),理论上bool只占用一个字节。
C++中,bool类型为了兼容c语法,实际使用时bool类型会当成只占1个字节的整型进行算术运算。结果值如果为非0时,则用true代替;如果为0时,则用false代替。
bool b = false;
printf("sizeof(b) = %d, b = %d\n", sizeof(b), b);// b = 0;sizeof(b) = 1(只占用一个字节)
因为c++是基础数据类型,因此bool类型可以定义全局/局部变量,数组,指针等待。
(7)三目运算符
int a = 1;
int b = 2;
((a < b) ? a : b) = 5;//a = 5,b = 2;
c语言中,三目运算符:(a < b) ? a : b),不能作为左值使用,只能作右值使用。
c++中,三目运算符可以作为左值,同时兼容c语言的右值用法。
int a = 1;
int b = 2;
((a < b) ? a : 1) = 5;错误使用
注意:c++中,三目运算符返回值中如果有任意一个值为常量值,则不能作为左值使用。
C++三目运算符可以作为左值使用时,其返回值都是变量时,返回的是引用。