C语言的优点:
1、 出色的移植行 2、访问硬件 3、运行效率高
注:所有的操作系统的内核都是用C语言实现的
C语言的缺点:
1、 扩展性差2、复用性差3、维护性差
面向对象:C++的优点:
1、 扩展性好2、复用性好3、维护性好
C语言+面向对象方法论:1、objective c2、c++
C++支持的编程规范:过程式、数据抽象、基于对象、面向对象式、函数式、泛型形式、模板元形式、值语义与对象语义
值语义可以拷贝与赋值,对象语义不可以进行拷贝和赋值
声明定义:
C++中强调语言的“实用性”,所有的变量都可以在需要的使用时再定义;
C语言中的都必须再作用域开始的位置定义;
Register
被register修饰的变量叫做寄存器变量
使用寄存器变量的注意点:
待声明的寄存器变量类型是CPU寄存器所能接受的类型,意味着寄存器变量是单个变量,变量长度应该小于寄存器长度。
不能对寄存器变量使用取地址符&,因为该变量是没有内存地址的;
尽量在大量频繁操作的时候使用寄存器变量,并且声明的寄存器变量个数尽可能的少。
Register关键字请求“编译器”将局部变量存储于寄存器中
C语言中是无法取得register变量的地址;
C++依然支持register关键字
C++编译器有自己的优化方式,不使用register也可能做优化;
C++中可以取得register变量的地址;
C++编辑器发现程序中需要取register变量的地址时,register对变量的声明变得无效;
Const
C++编辑器对const常量的处理
当碰见常量声明时在符号表中放入常量;
编译过程中若发现使用常量则直接以符号表中的值替换;
编译过程中若发现对const使用了extern或者&操作符时,则给对应的常量分配存储空间
注意:C++编译器虽然可能为const常量分配空间,但是不会使用其存储空间中的值;
动态内存分配
C++中的动态内存分配
C++中通过new关键字来进行动态内存申请
C++中的动态内存申请是基于类型进行的
Delete关键字是用于内存释放的
变量申请: 数组申请:
Type* pointer = new Type; Type*pointer = new Type[N];
//……. //…….
Delete pointer; delete [] pointer;
New关键字与malloc函数的区别
New关键字是C++的一部分;malloc是由C库提供的函数
New以具体类型为单位进行内存分配,malloc只能以字节为单位进行内存分配
New在申请单个类型变量时可进行初始化,malloc不具备内存初始化功能
引用是给一个变量起别名
定义引用的一般格式
类型& 引用名=变量名;
例如: int a= 1;
int& b = a;//b是a的别名,因此a和b是同一单元;
注:定义引用时一定要初始化,指明该引用变量是谁的别名;
函数传参:按引用传递
引用传递方式是在函数定义时在形参前面加上引用取地址符&;
例如:void swap(int &a,int &b);
按值传递方式容易理解,但形参值的改变不能改变实参的值
地址传递的方式通过形参的改变使相应的实参改变,但程序容易产生错误,而且难以阅读;
引用作为参数对形参的任何操作都可以改变实参的相应数据,又使函数调用显得方便,自然。
引用作为返回值
引用的另一个作用就是用于返回引用的函数;
函数返回引用的一个主要目的就是可以将函数放在赋值运算符左边;
注:不能返回对局部变量的引用
引用访问一个变量是直接访问,指针访问一个变量是间接访问;
引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间;
引用一经初始化,就不能再引用其他变量,而指针可以
注:尽可能的使用引用,不得已时使用指针。
内联函数
Inline int max(int a,int b)
{
Return a>b? a:b;
}
#define max(a,b) (a) > (b) ? (a):(b)
内联函数调用时,要求实参和形参的类型一致,另外内联函数会对实参的表达式进行求值,然后传递给形参;而宏替换只是用实参简单的进行替换形参;
内联函数是在函数编译的时候,在调用的地方将代码展开,而宏则是在预处理时进行替换;
在C++中建议使用内联函数来替换带参数的宏
函数重载的条件
函数重载的不同形式:
形参数量不同
形参类型不同
形参顺序不同
形参数量和形参类型的不同
调用重载函数时,编译器通过检查实际参数的个数、类型和顺序来确定相应的被调用函数
*extern “C”实现C和C++混合编程
#ifdef_cplusplus
extern “c”
{
#endif
…………
#ifdef_cplusplus
}
#endif