dedecms购物网站模板下载,美观网站建设哪家好,网站开发工具报告,wordpress 栏目不同模板初步认识面向对象及类的引入 前言一、面向过程和面向对象初步认识C语言C 二、类的引入C的类名代表什么示例 C与C语言的struct的比较成员函数访问权限继承默认构造函数默认成员初始化结构体大小 总结 前言
面向过程注重任务的流程和控制#xff0c;适合简单任务和流程固定的场… 初步认识面向对象及类的引入 前言一、面向过程和面向对象初步认识C语言C 二、类的引入C的类名代表什么示例 C与C语言的struct的比较成员函数访问权限继承默认构造函数默认成员初始化结构体大小 总结 前言
面向过程注重任务的流程和控制适合简单任务和流程固定的场景而面向对象则将数据和功能封装成对象通过对象间的交互实现复杂功能更适用于大型、复杂的软件系统开发。
类的引入是面向对象编程中的一个核心概念。通过类我们可以创建具有相同属性和行为的对象从而实现代码的重用和模块化。类定义了对象的结构和行为包括对象的属性数据成员和方法成员函数。通过实例化类我们可以创建对象并赋予它们特定的属性值。这样每个对象都具有独特的身份但仍然共享类的定义和行为。类的引入使得代码更加组织化、可维护性和可扩展性提高了软件开发效率和质量。 一、面向过程和面向对象初步认识
当我们开始接触编程时首先遇到的两个核心概念便是面向过程Procedural Programming和面向对象Object-Oriented Programming简称OOP。这两种编程范式各有其特点并且在不同的应用场景中发挥着各自的优势。
面向过程编程顾名思义是以一系列按照特定顺序执行的过程或函数为核心来构建程序的。在这种编程范式中程序员会定义一系列函数每个函数负责完成特定的任务然后通过一个主程序来调用这些函数以实现特定的功能。面向过程编程的优点在于其直观性和简单性特别适用于小规模、逻辑清晰的程序。然而随着程序规模的扩大和复杂度的提升面向过程编程的缺点也逐渐暴露出来如代码重复、难以维护、可扩展性差等。
与面向过程编程不同面向对象编程将现实世界中的事物抽象为对象每个对象都拥有属性和方法。对象之间可以通过消息传递进行交互从而实现复杂的功能。面向对象编程的核心概念包括类Class、对象Object、继承Inheritance、封装Encapsulation和多态Polymorphism。通过这些概念面向对象编程能够更好地模拟现实世界提高代码的可重用性、可维护性和可扩展性。
在实际应用中面向过程和面向对象编程往往不是孤立的而是相互补充的。对于某些特定的任务或模块使用面向过程编程可能更加合适而对于整个系统或大型项目采用面向对象编程则能够更好地组织和管理代码。因此作为程序员我们需要根据具体的需求和场景来选择合适的编程范式以达到最佳的开发效果。
C语言
C语言是面向过程的关注的是过程分析出求解问题的步骤通过函数调用逐步解决问题。 C
C是基于面向对象的关注的是对象将一件事情拆分成不同的对象靠对象之间的交互完成。 二、类的引入
类的引入在编程中是一个核心概念它允许我们创建具有相似属性和行为的对象集合。通过定义类我们可以封装数据属性和功能方法从而创建出具有特定特性和行为的对象。这种封装不仅提高了代码的可读性和可维护性还增强了代码的重用性。
C语言结构体中只能定义变量在C中结构体内不仅可以定义变量也可以定义函数。比如之前在我之前用C语言写的数据结构的文章中用C语言方式实现的栈结构体中只能定义变量现在以C方式实现会发现struct中也可以定义函数。
总结c兼容C语言中的struct用法但是c将struct升级成了类
C的类名代表什么
在C中类名代表了一种自定义的数据类型。类是一种用户定义的数据类型可以封装数据和成员函数以实现特定的功能。
类定义了一组数据成员和成员函数用于描述对象的状态和行为。数据成员表示对象的属性和状态而成员函数用于定义对象的行为和操作。
通过创建类的对象我们可以实例化该类并使用类的成员函数来操作对象的数据。类提供了一种封装数据和功能的机制使得代码可以更加模块化和可维护。
类名在C中是用来标识该类的唯一标识符。通常按照一定的命名规范如驼峰命名法命名类名以便于代码的可读性和可理解性。类名是用来声明类变量、创建对象和调用类的成员函数的重要标识符。
示例
在C语言中我们定义一个链表是按照下面的方式来定义的
typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;在C中定义一个链表却是按照下面这个方式来定义 struct SListNode
{SLTDataType data;SListNode* next;
};C中的struct具有与类相同的能力可以封装数据和成员函数。
C与C语言的struct的比较
C与C语言中的struct在定义和使用上有一些区别。
成员函数
C的struct可以包含成员函数而C语言的struct只能包含成员变量。
以下是一个使用C中的struct定义一个包含成员函数的示例
#include iostreamstruct Person {//成员变量std::string name;int age;//成员函数void display() {std::cout Name: name , Age: age std::endl;}
};int main() {Person p1;p1.name John;p1.age 25;p1.display();return 0;
}上述示例中我们定义了一个名为Person的struct它包含了两个成员变量name和age还有一个成员函数display()。在main函数中我们创建了一个Person对象p1并为其成员变量赋值然后通过调用p1.display()函数来显示该对象的信息。
而在C语言中如下
struct Person {int age;
};
void display() {……};上述示例中我们可见C语言的结构体只能定义成员变量
访问权限
C中的struct成员默认为public而C语言中的struct成员默认为public。这是因为C要兼容C所以都是public关于public可以看我的下一篇文章。
在C中struct和class的主要区别在于默认访问权限。下面是一个示例展示了C中的struct成员默认为public而C语言中的struct成员默认为public的区别
#include iostream// C中的struct默认成员为public
struct Person {std::string name;int age;void display() {std::cout Name: name , Age: age std::endl;}
};int main() {Person p1;p1.name John;p1.age 25;p1.display();return 0;
}在上述示例中我们定义了一个名为Person的struct它包含了一个string类型的name和一个int类型的age。还有一个名为display的成员函数用于显示该结构体的信息。
我们可以直接访问struct的成员变量和成员函数无需使用任何访问修饰符。在main函数中我们创建了一个Person类型的结构体变量p1并为其成员变量赋值。然后在display函数中我们通过p1对象直接调用成员函数来显示该结构体的信息。
需要注意的是C语言中的struct不支持成员函数默认情况下所有成员都是公开的可以直接访问。而C中的struct可以使用成员函数而且默认情况下成员是公开的。这是C语言和C中struct的一个主要区别。
继承
C的struct可以通过继承来拓展而C语言的struct不能进行继承。关于继承可以看我的后续文章。
在C中可以通过继承来拓展struct如下所示
struct Animal {int age;
};struct Cat : public Animal {std::string name;
};int main() {Cat cat;cat.age 3;cat.name Tom;return 0;
}在上面的例子中Cat结构体从Animal结构体继承继承后的Cat结构体包含了Animal的成员变量age并新增了一个成员变量name。
而在C语言中struct无法进行继承。C语言的结构体只能包含成员变量不能继承其他结构体的成员变量或方法。下面是一个C语言中使用结构体的例子
typedef struct {int age;
} Animal;typedef struct {Animal animal;char name[20];
} Cat;int main() {Cat cat;cat.animal.age 3;strcpy(cat.name, Tom);return 0;
}在上面的例子中Cat结构体包含了Animal结构体的成员变量age并新增了一个成员变量name。但是这种方式并不是继承而是嵌套了一个Animal结构体通过嵌套来实现在Cat中包含Animal的成员变量。
默认构造函数
C的struct可以有默认构造函数而C语言的struct没有默认构造函数。
下面是一个具有默认构造函数的C struct的例子
#include iostreamstruct Person {std::string name;int age;// 默认构造函数Person() {name Unknown;age 0;}
};int main() {Person person; // 调用默认构造函数std::cout Name: person.name std::endl;std::cout Age: person.age std::endl;return 0;
}在上述例子中定义了一个Person结构体并为其提供了默认构造函数。在默认构造函数中将name初始化为Unknown将age初始化为0。在主函数中创建了一个Person对象person由于没有提供任何参数因此使用了默认构造函数进行初始化。输出结果如下
Name: Unknown
Age: 0而在C语言中struct没有默认构造函数的概念。在C语言中需要手动为struct的成员变量赋初始值。下面是一个使用C语言的struct的例子
#include stdio.hstruct Person {char name[20];int age;
};int main() {struct Person person {Unknown, 0}; // 手动赋初始值printf(Name: %s\n, person.name);printf(Age: %d\n, person.age);return 0;
}在上述例子中定义了一个Person结构体并在主函数中手动为其成员变量赋初始值。通过使用大括号括起来的值列表来初始化结构体对象。输出结果与前面的例子相同
Name: Unknown
Age: 0默认成员初始化
C的struct可以在声明时为成员变量提供默认值而C语言的struct不支持默认成员初始化。
下面是一个C struct中支持默认成员初始化的例子
#include iostreamstruct Rectangle {int width 0; // 默认初始化为0int height 0; // 默认初始化为0
};int main() {Rectangle rectangle; // 使用默认初始化值std::cout Width: rectangle.width std::endl;std::cout Height: rectangle.height std::endl;return 0;
}在上述例子中定义了一个Rectangle结构体并在成员变量的声明时为其提供了默认值。在主函数中创建了一个Rectangle对象rectangle由于没有提供任何初始化值因此会使用成员变量的默认值进行初始化。输出结果如下
Width: 0
Height: 0而在C语言中不支持这种在声明时为成员变量提供默认值的特性。在C语言中需要在初始化结构体对象时手动为其成员变量赋值。下面是一个使用C语言的struct的例子
#include stdio.hstruct Rectangle {int width;int height;
};int main() {struct Rectangle rectangle {0, 0}; // 手动赋初始值printf(Width: %d\n, rectangle.width);printf(Height: %d\n, rectangle.height);return 0;
}在上述例子中定义了一个Rectangle结构体并在主函数中手动为其成员变量赋初值。通过使用大括号括起来的值列表来初始化结构体对象。输出结果与前面的例子相同
Width: 0
Height: 0结构体大小
C语言中的struct的大小仅受成员变量的大小和对齐方式影响而C中的struct除了受成员变量的大小和对齐方式影响还有可能受到虚函数表的影响。关于虚函数可以看我后续文章。
下面是一个展示C语言和C中struct大小差异的例子
在C语言中struct的大小仅受成员变量的大小和对齐方式的影响不会受到其他因素的影响。考虑以下示例
#include stdio.hstruct Rectangle {int width;int height;
};int main() {struct Rectangle rectangle;printf(Size of Rectangle: %zu bytes\n, sizeof(rectangle));return 0;
}在上述C语言示例中定义了一个Rectangle结构体包含两个int类型的成员变量width和height。在主函数中使用sizeof运算符来获取结构体Rectangle的大小并打印输出。
输出结果为
Size of Rectangle: 8 bytes在这个例子中width和height各占4个字节所以Rectangle结构体的大小为8字节。
而在C中struct除了受成员变量的大小和对齐方式的影响还有可能受到虚函数表的影响。考虑以下示例
#include iostreamstruct Shape {virtual void draw() {std::cout Drawing a shape. std::endl;}
};struct Rectangle : public Shape {int width;int height;
};int main() {Rectangle rectangle;std::cout Size of Rectangle: sizeof(rectangle) bytes std::endl;return 0;
}在上述C示例中定义了一个Shape结构体其中包含一个虚函数draw()。然后定义了一个Rectangle结构体通过公共继承从Shape继承并添加了两个int类型的成员变量width和height。
在主函数中创建了一个Rectangle对象并使用sizeof运算符获取其大小并打印输出。
输出结果为
Size of Rectangle: 16 bytes在这个例子中除了width和height各占4个字节还会有额外的字节用于存储虚函数表指针以便支持多态性。因此Rectangle结构体的大小为16字节。
这个例子展示了C中的struct可能受到虚函数表的影响使得其大小与仅受成员变量大小和对齐方式影响的C语言struct不同。
总结
需要注意的是尽管C的struct比C语言的struct功能更强大但C中的class更常用于定义对象。C中的class与struct的唯一区别在于默认访问权限class中成员默认为private而struct中成员默认为public。