2.类与对象
在了解类与对象之前,先了解一下编程语言主干哪些事。简单来说,编程语言就是对事、物的描述
1.对事的描述
事就是对一个流程的描述,拿吃饭来说,“先拿碗筷--->再盛饭菜--->最后吃到嘴里”,这么一个流程就是吃饭。
对应编程语言来说,吃饭就是一个函数,具体的流程就是由if...else、循环组成
简单来说,函数就是编程语言对事的描述
2.对物的描述
物就是对一个具体存在的东西的描述,还是拿吃饭来说,吃饭用的碗就是一个具体的东西,我们知道有碗这个东西,具体点就是碗的材质、容量、形状、颜色等,有了这些具体的属性,就描述出了一个碗。
对应编程语言来说,碗就是一个结构体,具体的属性就是由变量、数组组成
简单来说,结构体就是编程语言对物的描述
说完了编程语言,再来说C与C++的区别
1.C
更注重对事的描述,也就是对流程的描述,它要细化到流程的每一步要做什么(先干嘛-在干嘛-然后干嘛......一直到流程结束),要一清二楚
2.C++
更注重对物的描述,也就是对具体的东西的描述,我只要知道吃饭需要什么(碗筷、饭菜、吃到嘴里),再把这些东西组合起来就行了,当然了具体的实现还是要自己去写
然后呢,再大概说一下什么是类,什么是对象
1.类,其实就是一种概念,比方说“碗”,这就是一种概念,我知道可以用碗来吃饭、喝水、放筷子......等等,但是具体是个什么样子,我不知道
2.对象,就是具体存在的事物,比如"碗",我知道了它的具体属性,如材质、容量、形状、颜色......等等,我才知道,原来它长这个样子
接下来,再说一下this指针
本质:this就是一个指针变量
每个对象都有这个指针变量,这个指针变量指向对象本身
就拿“我”这个称呼来说,每个人都可以用"我"来称呼自己,"我"就相当于是this指针
最后,再了解一下什么是函数指针
例如有这样一个函数: void show(int a,double b);
1.函数指针类型
void (*) (int , double);
这就是一个函数的类型,就和int,double,char一样
2.定义函数指针
void (*pFun) (int , double);
这就是一个函数指针,pFun就是变量名,就和int* p;这样,pFUN就和p是一样的,都是一个变量名
3.函数指针的赋值
pFun = show;
show其实就类似于是一个指针变量,它就是保存的一个函数的首地址,让pFun=show,就是让pFun这个指针,指向show这个函数的首地址
4.函数指针的使用
pFun(100,200.11);
就和正常使用函数一样,只是多了一个传参的过程
了解了以上这些知识后,现在就可以用C语言的方式实现面向对象了(程序使用的是win32控制台应用程序)
#include "stdafx.h" //碗 struct bowl { //这些都是成员变量(碗的属性) int size; //容量 double price; //价格 char* shape; //形状 //初始化 void (*pFunInit) (bowl* wan,int size,double price,char* shape); //显示自己 void (*pFunShow) (bowl* wan); //销毁自己 void (*pFunDestory) (bowl* wan); }; //函数声明 void Init(bowl* wan,int size,double price,char* shape); void Show(bowl* wan); void Destory(bowl* wan); //主函数 int _tmain(int argc, _TCHAR* argv[]) { bowl wan; int size = 10; double price = 12.5; char shape[1][20] = {"正方体"}; wan.pFunInit = Init; wan.pFunShow = Show; wan.pFunDestory = Destory; wan.pFunInit(&wan,size,price,shape[0]); wan.pFunShow(&wan); wan.pFunDestory(&wan); while(1); return 0; } //函数实现 void Show(bowl* wan) { printf("容量:%d\n大小:%lf\n形状:%s",wan->size,wan->price,wan->shape); } void Init(bowl* wan,int size,double price,char* shape) { wan->size = size; wan->price = price; //方式一:一个一个赋值 //strcpy(wan->shape,shape); //方式二:整块内存拷贝(效率更高) int nLenght = strlen(shape); wan->shape = (char*)malloc(sizeof(char)*nLenght+1); memcpy(wan->shape,shape,nLenght+1); } void Destory(bowl* wan) { wan->size = 0; wan->price = 0; free(wan->shape); wan->shape = NULL; }
补充知识
c++动态开辟内存
1.关键字介绍
new和new[],相当于malloc
delete和delete[],相当于free
2.使用
//开辟一个int类型的内存段,与释放方式
int a = new int;
delete a;
//开辟十个int类型的内存段,与释放方式
int a = new int[10];
delete[] a;
命名空间(名字空间)
1.由来
编程语言的出现是为了帮助科学家计算复杂的数学问题而诞生的,此时使用的就是汇编语言。后来由于人手不够,而汇编语言的入门又太难,拿学历来说就是必须是博士、硕士才学的会,所以为了简化编程语言的入门难度,C语言就诞生了(贝尔实验室了解一下)。
C语言让入门难度相对容易了一些(本科),但是多个人一起开发会很麻烦,比如我要定义一个全局变量,那么我就要叫全部的人一起开会,告诉大家,我要定义一个全局变量,名字叫某某某。C++就此诞生(贝尔实验室再了解一下),相对的命名空间也由此出现了。
2.什么是命名空间
例如在学校里,有两个人都叫小明,为了区分他们,我们可以把他们分到不同的班级,这样就能够区分他们了,命名空间就相当于班级。
有了命名空间,就可以区分名字相同的变量或者函数了。
一班 二班
小明(一班小明) 小明(二班小明)
3.定义
关键字: namespace
namespace 命名空间名
{
这里面就放变量、函数
}
4.使用
例如现在有如下命名空间
namespace Fun1
{
void Fun()
{
printf("我是Fun1");
}
}
namespace Fun2
{
void Fun()
{
printf("我是Fun2");
}
}
有三种使用方式
4-1 在最上面声明命名空间(全局)
例如:using namespace Fun1;
这样声明后,就把Fun1中所有的东西都暴露出来了,在使用Fun函数时,就只能使用Fun1中的函数
4-2 临时使用
例如: Fun1::Fun();
这样就相当于使用命名空间Fun1中的Fun函数,只生效一次
4-3 临时使用单个命名空间的函数
例如: using Fun1::Fun;
这样只暴露了命名空间Fun1中的Fun,使用时直接用Fun即可
内联函数
1.什么是内联函数
建议编译器使用它为内联函数,相当于是一个申请,需要编译器同意
方式1: inline 关键字 声明一个函数为内联函数
方式2: 声明函数的同时定义函数()
2.好处(作用)
以膨胀内存的方式来节约时间
3.内存四区
代码区: 我们写的代码就是放在代码区
静态区: 用static修饰的变量、函数,就是放在静态区
堆区: 动态开辟的内存,就是使用的堆区
栈区: int,double,char等,直接声明的变量,就是使用的栈区
4.函数调用过程
跳转到代码区,根据函数地址,找到对应函数(要花时间的)
频繁调用的函数,每次执行都要频繁跳转到代码区,就会花费很多时间
解决方式:
4-1宏函数 简单函数替换,无跳转过程,编译后的文件会比较大,每执行一次,就会有一段该函数
4-2 内联函数 编译器会优化,无跳转过程,编译后的文件会比较大,每执行一次,就会有一段该函数
5.内联函数与宏函数的区别
5-1 时机:
宏函数 预处理
内联函数 编译时
5-2 优化
宏函数 不优化,不做语法检查
内联函数 编译器会优化,做语法检查
5-3 传参
宏函数 无传参
内联函数 有传参
6 不建议内联:
6-1 行数超过5行
6-2 有循环、递归等复杂流程
6-3 调用次数少
浙公网安备 33010602011771号