一、面向过程编程 VS 面向对象编程
1、面向过程的特点:
a、c语言特点:
(1)c语言是在实践的过程中逐步完善起来的
没有深思熟虑的设计过程,使用时存在很多“灰色地带”
(2)残留量很多低级语言的特征
直接利用指针进行内存操作
c语言的目标是高效
b、面向过程程序设计:数据结构+算法
问题:软件可重用性差;
软件可维护性差;
构建的软件无法满足用户需求。
2、面向对象的编程特点:继承、封装、多态性
3、C++支持的编程范式
过程式、数据抽象、基于对象、面向对象式、函数式、泛型形式、模板元形式。
二、C++相关基础知识点
1、C++之父是谁?
本贾尼`斯特劳斯特卢普
2、C++语言的标准
C++98,C++03,C++11
三、从C到C++的升级
1、声明定义
C++中更强调语言的实用性,所有的变量都可以在需要使用时再定义。
使用register注意以下几点:
(1)、register只能修饰局部变量,不可修饰全局变量或函数;
原因:全局变量被多个进程访问,修饰为register只有当前进程知道保存于何处,其他进程无从知晓。
(2)、不能用&获取register变量地址
原因:&获取的是内存地址,而register变量保存的是寄存器的地址;
(3)、register只修饰CPU所能接受的数据类型;
而在C++中可以取得register变量地址,对register关键字进行了优化。
3、const关键字
C语言中,const关键字的作用:
1、const修饰变量时,使该变量为只读变量,即const修饰的该变量,虽然空间可变,但是不能通过修饰的变量名修改空间。
2、用const修饰形参的作用:防止函数实现过程中修改实参的值,一旦被修改,立刻报错,便于调试。
C++编译器对const常量的处理
a、当碰见常量声明时在符号表中放入常量
b、编译过程中若发现使用常量则直接以符号表中的值替换
c、编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间
注:C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。
4、内存分配与释放
野指针指指向一个已删除的对象或未申请访问受限内存区域的指针。
C++中动态内存分配
C++中通过new关键字进行动态内存申请
C++中的动态内存申请是基于类型进行的
delete关键字用于内存释放
变量申请:
int *p = new int; delete p;
数组申请:
char *ptr = new char[100];delete [] ptr;
new关键字和malloc的区别:
(1)new是运算符,malloc是函数
(2)new 以具体类型为单位进行内存分配,malloc只能以自己为单位进行内存分配。
(3)new在申请单个类型变量时可以初始化,malloc不具备内存初始化的特性。
如:int *p =new int(5);
cout << “p = ”<<*p<
delete p;
#include
void func1(char *ptr)
{
printf("ptr = %s",ptr);
}
void func2(char (*ptr)[100])
{
int i;
for(i= 0;i < 2; i++)
{
printf("func2 = %s\n",ptr[i]);
}
}
void func3(char **ptr)
{
int i;
for(i= 0;i < 3; i++)
{
printf("func3:%s\n",ptr[i]);
}
}
int main()
{
char ptr[100] = "hello world";
char str[100][100] ={"hello","world"};
char *ktr[3] ={"hello1","hello2","hello3"};
func1(ptr);
func2(str);
func3(ktr);
return 0;
}
以上代码说明,一维数组名指针来接。二维数组名数组指针接。指针数组用指针的指针来接。
同理,用new申请空间时,
int (*pp)[2] = new int[2][2];
int (*ppp)[6][6] = new int [6][6][6];
5、引用VS指针
(1)引用
作用:引用是给一个变量起别名
一般格式:类型 &引用名 = 变量名;
例:int a =1;
int &b = a;
定义引用时一定要初始化,指明该引用变量为别名
例:int num = 5;
int &p =num;
p++;
cout <
输出:6;
在实际应用中,引用常作形参和返回值
6.指针与引用区别
(1).引用访问一个变量是直接访问,指针是间接访问;
(2).引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间;
(3).引用一经初始化不能再引用其他变量,而指针可以;
(4).尽可能使用引用,不得已使用指针。
const引用
const int num = 5;
const int &p = num;
p++;
7、函数升级
(1)内联函数(inline)
内敛函数inline int max (int a,int b)
{
return a > b?a:b;
}
宏函数
#define MAX (a,b) (a) > (b) ? (a):(b)
宏函数与内嵌函数的比较:
宏函数执行效率高,不用分配内存,占用了替换时间,省去了为形参分配空间,典型的“以时间换空间”
内联函数省去调用和返回时间,增加内存空间,以空间换取时间。
一般将频繁调用的函数设为内敛函数。
(2)函数重载
定义:相同的作用域,如果两个函数名称相同,而参数不同,我们把它们称为重载
条件:形参数量不同,类型不同,顺序不同,返回值不能作为重载条件。
为了实现C与C++的混合编程,使用extern “C”
带默认形参值的函数
函数没有声明时,在函数定义中指定形参的默认值;
函数既有定义又有声明时,声明时指定后,定义后就不能再指定默认值;
默认值的定义必须遵守从右往左的顺序,如果某个形参没有默认值,则他的左侧参数不能没有默认值;
函数调用时,实参与形参按从左往右的顺序进行匹配。
7、命名空间
定义:namespace name
{
…..
}
命名空间的使用:
使用整个命名空间:using namespace name;
使用命名空间中的变量:using name::variable;
使用默认命名空间中的变量:::variable
默认情况下可直接使用默认命名空间中的所有标识符。