随笔 - 10,  文章 - 1,  评论 - 4,  阅读 - 2059

c语言之面向对象的三大特性

面向对象和面向过程的区别

我们都知道面向对象的三大特征:封装、继承和多态。从内存角度来看,面向对象开发大量的使用堆内存并且简化了堆内存的操作。从语法角度看数据和方法与对象像关联。

一、 封装性

public class Student
{
    public string Name;
    public int Age;
    public Student(string name,int age)
    {
        Name = namw;
        Age = age;
    }
    public void Study()
    {
        Console.WriteLine("{0}正在学习..." ,Name);
    }
}
public Program
{
    public static void Main(string args[])
    {
        Student stu = new Student("张三" ,20);
        stu.Sutdy();
    }
}

对应的C代码

typedef struct _student
{
    char name[255];//理论上此处应写成char* name,思考两者的区别(因为string是引用类型,故用c指针表示)
    int age; 
} Student;
//构造函数
Student* StudentConstructor(char* name,int age)
{
   Student* stu = (Student)malloc(sizeof(Student));
   strcpy(stu->name, name);
   stu->age = age;
   return stu;
}
void Study(Student* stu)
{
   printf("%s正在学习...",stu->name);
}
int main(void)
{
    Student* stu = StudentConstructor();
    Study(stu);
}

可见面向对象只是一种语法机制,把对象的数据成员和函数成员封装到了一个class之中,而c不行。这样简化了指针使用的复杂度,能够将数据和方法进行绑定。
实际上上述面向对象的代码底层应该是这样的。

//伪代码,仅供参考
public struct Student
{
    public string Name;
    public int Age;   
}
//实际上编译之后,函数成员和数据成员是分开的(因为函数在代码区,是可以复用的),而数据成员是不能复用的,对象不太,数据成员的值可能不同
public Student(string name, int age)
{
    Student stu = new Student();
    stu.Name = name;
    stu.Age = age;
}
//实际上数据成员是通过参数传递给虚函数(也叫成员函数)的
public void Study(Student stu)
{
    Console.WriteLine("{0}正在学习..." ,stu.Name);
}

二、 继承性

由于面向对象的封装特点,继承能够很好的实现代码的复用,而c语言无需继承,因为没有封装性,因此无需继承,即可调用(这无疑使得程序变得很混乱)。

三、 多态

定义:同一个对象可以有不同的表现形式。

多态存在的三个必要条件

  1. 要有继承;
  2. 要有重写;
  3. 父类引用指向子类对象。

面向对象中的多态

public abstract Person
{
    void Sleep();
}
//继承
public Student:Person
{
    void Study();
}
//学生对象既可以表现人的特征,也能表现学生的特征
//person指向的对象是Student类型
Person person = new Student();
person.Sleep();//由于继承了Person
Student student = (Person)person;//由于person指向的对象实际是一个学生

由于c语言没有继承的特性,因此c语言天生支持多态。

char c = 'c';//定义一个字符“对象”
int* i = (int*)&c;//i指向一个字符“对象”,但表现的特征是int
char* j = (char*)i;//此时表现出字符的特征
posted on   花间岛  阅读(380)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示