C++是C语言的一个超集,标准C语言的所有知识在C++中都是有效的。C属于结构化程序设计语言,C++属于面向对象程序设计语言。
1.注释
// 引入单行注释
/* 原有多行注释
*/
2.定义类型
// 在C语言中定义类型必须加上关键字,结构类型(struct),联合类型(union),枚举类型(enum)
struct tagStudent m_student;
union FloatAndBit m_FloatAndBit;
enum weekday m_WeekDay;
// 在C++中可以直接使用结构名,联合名以及枚举名来定义变量
tagStudent m_student;
FloatAndBit m_FloatAndBit;
weekday m_WeekDay;
3.变量随时定义
// 在C中所有对局部变量的定义都必须发生在函数或复合语句的开始部分,而在C++中则可以再变量需要的任何位置定义变量
4.作用域限定运算符
// C++中新增运算符::可以解决命名冲突,假设有一个局部变量SomeVar和全局变量SomeVar,::SomeVar允许在局部变量SomeVar的作用域内存取全局变量SomeVar
// 但在C语言中没有::,无法在局部变量SomeVar的作用域内存取全局变量SomeVar
int k;
void main(){
int k = 1;
::k = 5; // 外面的全局变量被定义为5
}
5.常量定义符const
// C++可以使用const定义一个常量(引入const为了替换C中的预编译处理指令#define),比#define定义更加精确(#define无法准确反映常量的数据类型,且#define具有全局作用域,而const可以定义在程序的任何地方)
const int m=10;
// C++中常量指针和指针常量是const两个容易混淆的用法
// 常量指针指这个指针所指向的变量值不能通过该指针来修改
const int *ptr=&x; // 定义一个常量指针,并将其初始化为变量x的地址
x = x+2; // 可以这样来修改x的值
*ptr = 5; // 不能用常量指针ptr修改x的值,这条语句是错的
// 指针常量是指该指针是一个常量型指针,他的值不能被修改,但该指针所指向的变量值却可以通过该指针来修改(一个数组变量就是一个指针变量)
int * const ptr = &x; // 定义一个指针常量
ptr = &y; // 错误,不能将指针指向另一个变量
*ptr = 3; // 正确,可以用指针ptr来修改x的值
6.联合匿名
// C++可以在任何能够定义变量的地方定义一个没有名称的联合,匿名联合的各个成员可以直接存取
void main(){
union{
int i;
float m;
}
i = 34;
m = 3.15;
}
7.显式类型转换
// 在C++中,预先定义类型或程序员自定义类型的名称都能够作为一个函数使用,一边将数据从一种类型强制转换为另一种类型
int i;
float r = float(i);
// 但不使用C中的float(i);
8.类型检查的强化
// C语言编译器中,类型检查机制非常弱,而C++编译器中对类型检查进行了强化。函数调用时,传送到函数内参数的个数和值的类型需要与函数定义是的形参的个数与类型相匹配,否则编译器将发出警告信息,而在大多数C编译器中是不具有该项功能的
// C++还对函数的返回值类型进行检查,如果定义了一个函数具有返回值,而没有使用retur返回函数值,则编译器将出错,而在C语言中可以通过编译
9.函数定义的扩展
// C++中对函数的使用作了进一步扩展,加入了函数名称重载、默认函数参数、不定函数参数、内联函数等内容
10.变量的引用特性
// C++中新增加了引用变量类型,引用类型的变量实际上是另外一个变量的别名,对引用类型变量的任何修改都会反映到他所引用的变量上
11.new和delete运算符
// C++中尽管仍然可以使用C的动态内存分配函数为指针分配内存,但C++推荐使用两个运算符new和delete来堆内存进行动态分配。这两个运算符不仅可以保证可靠地控制存储区的分配,而且他们非常适合动态对象的创建,此外他们还可以在不同的类中进行重载
pointer_var = new var_type; // 其中var_type是一个数据类型名,pointer_var是指向该类型的指针
// new从称为堆的一块空闲内存中为程序分配至少可以保存var_type类型数据的一段内存,并返回该段内存的首地址,该地址赋给指针变量pointer_var
// 例如 int *p = new int; 分配失败则返回空指针null,分配成功则p指向所分配空间的首地址
int *p = new int(5); // 初始化这块内存的初始值
int *p = new int[5];
delete pointer_var; // 释放空间
12.函数扩展
// 在C++中函数的参数可以定义为默认值,参数数目可以是不确定的,而且函数的参数和返回值允许为引用类型。可以定义内联函数以提高函数调用的执行效率,还允许在同一个工程中定义名称相同但参数类型不同的几个函数
// 内联函数
// 函数的调用导致了一定数量的额外开销,参数的入栈、调用执行等都需要占用一定的计算机时和内存空间
// C++引入内联函数,内联函数在编译时直接插入到对他的每一个调用处,而不是编译为单独一段可执行代码,从而减少函数调用的额外开销
inline void func(); // 内联函数使用关键字inline进行声明