总结出C语言和c++的不同
综述:
C++这个词在中国大陆的程序员圈子中通常被读做“ C 加加” , 而西方的程序员通常读
做“ C plus plus” , 它的前身是 C 语言。
C++是在 C 语言的基础上开发的一种集面向对象编程、 泛型编程和过程化编程于一体的编
程。
1980 年, 美国贝尔实验室的 Bjarne Stroustrup 博士及其同事在 C 语言的基础上, 从
Simula67 中引入面向对象的特征, 开发出一种过程性与对象性相结合的程序设计语言。 最初称
为“带类的 C” , 1983 年取名为 C++。 此后, C++经过了许多次改进、 完善, 发展成为现在
的 C++。
目前的 C++具有两方面的特点: 其一, C++是 C 语言的超集, 因此其能与 C 语言兼容; 其
二, C++支持面向对象的程序设计, 使其被称为一种真正意义上的面向对象程序设计语言。 C++
支持面向对象的程序设计方法, 特别适合中型和大型的软件开发项目。 从开发时间、 费用到软件
的重用性、 可扩充性、 可维护性和可靠性等方面, C++均具有很大的优越性。
语言 | 头文件 | 编译器 | 输入输出的变化 | 编程思想 |
---|---|---|---|---|
c语言 | #include<xxx.h> | gcc/cc xxx.c | scanf/printf | 面向过程 |
c++语言 | #include | g++/c++ | cin/cout | 面向对象 |
新增特性
1.命名空间
using namespace std; //引入标准命名空间
还可以自定义命名空间
namespace 命名空间名字
{
变量、 函数等
} //不加‘;‘
使用名字空间指令的方式声明命名空间
如:
using namespace std;
2.引用的出现
形参与实参共用一个地址,将形参作为实参的别名达到指针传递的效果
引用与指针的区别
(1)引用必须初始化, 指针可以不初始化
int& a; // error
int* pa; // 野指针
(2)引用不可以为空, 指针可以为空
int& a = NULL; //error
const int& a = NULL; //常引用
const int& a = 11; // ok
int* pi = NULL; //空指针
(3)引用不可以更换目标, 指针可以
int a = 10;
int& b = a;
int m = 20;
b = m; => a = m; 赋值
int* pi = &a;
pi = &b;
(4)可以定义指向指针的指针, 但是不可以定义指向引用的指针
如:
int a = 10;
int* pa = &a;//一级指针
int** ppa = &pa;//二级指针
int& b = a;//a 起别名为 b
int& *pb = &b; //error
(5)可以定义引用指针的引用, 不可以定义引用 引用的引用
如:
int a = 10;
int* pa = &a;
int* &ra = pa; //ok
int& b = a;
int&& rb = b; // error
(6)不能声明引用型数组, 可以声明指针型数组
int& arr[10]; //error
int* arr[10]; //ok
int arr[10]; //ok
int (*arr)[10]; //ok
引用中的注意事项
3.关于结构体
C 语言中:
struct Student/*结构体类型名*/
{ ... };
struct Student/*左边整体作为一个完整的数据类型*/ s;
typedef struct Student
{ ....}Student/*别名*/;
typedef struct
{....}Student/*别名*/;
C++中:
struct Student{...};
[struct] Student s;
(1)C++中的结构体定义变量时可以省略 struct 关键字
(2)C++中的结构体内部可以定义函数, 并且函数内使用成员变量时不需要. ->之类的
(3)C++中的结构体中可以定义函数
4.bool类型
C 语言中:
bool #include<stdbool.h>
int
C++中:
bool 类型是 C++中的基本数据类型, bool 类型的值有两个: true 和 false,其本质上
就是 1 和 0
bool 类型本质上就是一个单字节整数, 任何基本数据类型都可以被隐式地转换为 bool
类型
注意:
bool 类型定义变量, 可以作为函数的参数和返回值类型, 当然也可以定义指针类型
5.类型转换
隐式类型转换: 一般从小 -> 大
显式类型转换(强制类型转换): 一般从大到小的转换
如:
char c ;
int i = (int)c; //C 语言风格
int i = int(c); //C++风格
6.函数的重载
(1)重载的概念
在同一个作用域中, 函数名相同, 函数的参数列表不同构成重载关系, 在不同的作用域
中遵循标示符隐藏原则
(2)函数重载的方式
a.函数名相同, 参数类型不同
b.函数名相同, 参数个数不同
c.函数名相同, 参数顺序不同
d.函数名相同, const 修饰的常函数和普通成员函数构成重载(以后讲到)
(3)重载匹配的原则
完全匹配 > 常量转换 > 升级转换
> 标准转换 > 自定义类型转换(以后讲到) > 省略匹配
(4) 函数重载的原理
a.C++编译器通过对函数进行换名, 将参数表信息体现在新的函数名中, 从而实现重载
如:
void show(int i,int j){}
=> _Z4showii; 换名之后的新名字
void show(int j,int i)
=> _Z4showii;
b.C 程序也可以通过 C++编译器换名后的新函数名调用 C++模块中的函数
c.通过 extern "C" 关键字可以明确要求 C++编译器不要对函数进行换名的操作, 以满
足 C 程序可以直接调用 C++模块中的函数
7.内联函数
使用 inline 关键字修饰的函数叫做内联函数
类似于 C 语言中的宏函数, 可以进行指令的替换, 相对于宏函数有一定的优势, 可以检
查数据类型, 可以计算表达式的值等等
注意:
inline 关键字修饰函数, 仅仅表示这是一种建议而不是要求, 所有使用 inline 关键字
修饰的函数不一定会做内联的处理;反之, 没有使用 inline 关键字修饰的函数也可能根据
编译器的优化策略进行内联处理
练习:
自定义一个计算 int 类型参数平方的函数, 并且通过返回值返回计算的结果, 分别使用
inline 修饰和不修饰去观察是否内联