03_C语言构建C++中的类(另类的面向对象)

在构建类时,需要借助于define和typedef两个标识符的帮助,先了解下两者的特性:

define和typedef

define

define是C语言中的预处理命令,用于宏定义。它可以分为无参宏定义和带参宏定义。

无参宏定义的一般形式为:#define 宏名 字符串。其中的“#”表示这是一条预处理命令,“define”为宏定义命令,“标识符”为所定义的宏名,“字符串”可以是常数、表达式、格式串等。

带参宏定义的一般形式为:#define 宏名(参数表) 字符串。它类似于函数,在宏定义时可以指定参数,并在使用时传递参数。

define命令在编译前将程序中所有的宏名替换为对应的字符串,从而进行宏展开。这使得程序员可以使用简单的名称代替复杂的代码片段,提高了代码的可读性和可维护性。同时,define还可以用于条件编译,如#ifdef、#ifndef、#undef等。

举例:
1.无参宏定义:

#define PI 3.14159  
#define N 100

其中PI被定义为3.14159,N被定义为100。在程序中使用PI和N时,它们会被替换为对应的值。

2.带参宏定义:

#define SQUARE(x) ((x) * (x))

其中SQUARE被定义为一个带参宏,它接受一个参数x,并将其平方。在程序中使用SQUARE(5)时,它会被替换为((5) * (5))。

在带参宏定义中,宏名和形参表之间不能有空格出现。同时,形式参数不分配内存单元,因此不必作类型定义。而在宏调用中的实参有具体的值,要用它们去代换形参,因此必须作类型说明。这是与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”。而在带参宏中,只是符号代换,不存在值传递的问题。另外,在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。

typedef

typedef是C语言中的一个关键字,用于为已有的数据类型定义一个新的名称(别名)。其主要作用包括:

提高代码的可读性和可维护性:使用typedef可以为复杂的数据类型定义简洁的名称,使代码更加易于理解和维护。
简化复杂数据类型的声明:使用typedef可以简化复杂数据类型的声明,减少出错的可能性。
便于跨平台开发:使用typedef可以定义与平台和编译器无关的数据类型,便于跨平台开发。
下面是一些typedef的常见用法:

1.为基本数据类型定义别名:

typedef int Integer;  
typedef float Float;

Integer和Float分别被定义为int和float的别名。

2.为指针类型定义别名:

typedef int* IntPtr;

IntPtr被定义为指向整数的指针类型。

3.为数组类型定义别名:

typedef int IntArray[10];

IntArray被定义为包含10个整数的数组类型。

4.为结构体类型定义别名:

typedef struct {  
  int x;  
  int y;  
} Point;

Point被定义为包含两个整数成员的结构体类型。

为函数指针类型定义别名:

typedef int (*CompareFunc)(const void*, const void*);

CompareFunc被定义为指向接受两个指针参数并返回整数值的函数的指针类型。

总之,typedef是一个非常实用的C语言关键字,它可以帮助程序员为已有的数据类型定义新的名称,简化复杂数据类型的声明,提高代码的可读性和可维护性。

两者区别

1.定义不同:define定义后面不用加分号,并且它的别名在对象的前面;typedef需要加分号,并且它的别名在对象的后面。
2.原理不同:define是预处理中的宏定义命令,在预处理时进行简单的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错;typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。
3.作用域不同:define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用;typedef有自己的作用域。

定义类

程序设计:使用C语言定义学生类Student

#include <stdio.h>
/*
首先使用带参宏定义将后两行中的Name进行替换
然后使用typedef将struct Name替换为Name来代替

因此在定义数据结构时将后面的 “{};”带上即可

声明类,或者说创建一个数据结构时,可以使用CLASS(Student)
*/

//1.分离式定义
#define CLASS(Name)                 \
typedef struct Name Name;           \
struct Name

CLASS(Student)
{
    int a;
    int b;
};

//2.另类定义,不建议
typedef struct P P;
struct P
{
    char c;
    int(*Fun)(int a, int b);
};

int sun(int a, int b)
{
    return a + b;
}

int main()
{
    Student student;
    student.a=0;
    student.b=1;
    printf("%d******%d\n",student.a,student.b);

	P person;
    person.c='a';
    person.Fun=sun;
    printf("person.c=%c, 2+3=%d\n",person.c, person.Fun(2,3));
    
    return 0;
}
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月光在发光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值