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语言无需继承,因为没有封装性,因此无需继承,即可调用(这无疑使得程序变得很混乱)。
三、 多态
定义:同一个对象可以有不同的表现形式。
多态存在的三个必要条件
- 要有继承;
- 要有重写;
- 父类引用指向子类对象。
面向对象中的多态
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;//此时表现出字符的特征
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性