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 调用次数少

posted @ 2020-04-23 23:01  打好基础才是第一步  阅读(151)  评论(0)    收藏  举报