网站开发需要做什么,国外优秀的网站设计,东莞专业技术人才服务网,怎么导出wordpress 整个网站 #x1f331;博客主页#xff1a;青竹雾色间. #x1f618;博客制作不易欢迎各位#x1f44d;点赞⭐收藏➕关注 ✨人生如寄#xff0c;多忧何为 ✨ C是一种强大的编程语言#xff0c;其面向对象的特性使得代码结构更加清晰、易于维护和扩展。在C中#xff0c;类与… 博客主页青竹雾色间. 博客制作不易欢迎各位点赞⭐收藏➕关注 ✨人生如寄多忧何为 ✨ C是一种强大的编程语言其面向对象的特性使得代码结构更加清晰、易于维护和扩展。在C中类与对象是面向对象编程的核心概念之一它们为程序员提供了一种组织和封装代码的方法。本文将深入探讨C中的类与对象包括其定义、使用和特性以及this指针的使用。 目录 一.面向过程和面向对象初步认识二.类与对象的概念2.1类与对象的特性2.2类的引用2.3类的定义2.4 类的作用域2.5对象的创建与使用2.6类的实例化 三 .类对象模型3.1 如何计算类对象的大小3.2 类对象的存储方式猜测 四. 构造函数与析构函数五.成员访问权限六.this指针6.1 this指针的引出6.2 this指针的特性 一.面向过程和面向对象初步认识
在编程中有两种主要的编程范式面向过程和面向对象。 面向过程编程 将问题分解为一系列的步骤和函数强调程序的流程控制分析出求解问题的步骤通过函数调用逐步解决问题 例如C语言 面向对象编程(OOP) 将问题分解为一系列的对象强调对象的属性和行为。面向对象编程更加灵活、模块化和可扩展。 例如Java、Python、C等
二.类与对象的概念
在C中类是一种用户自定义的数据类型用于封装数据和方法。类由数据成员和成员函数组成数据成员存储类的属性而成员函数则用于操作这些属性。通过类可以创建对象对象是类的实例化它具有类中定义的属性和行为。
2.1类与对象的特性 封装类封装了数据和方法隐藏了实现细节使得代码更加模块化和可维护。 继承通过继承一个类可以从另一个类继承属性和行为提高了代码的重用性。 多态多态性允许不同的对象对同一消息作出不同的响应增强了代码的灵活性和可扩展性。
2.2类的引用
C语言结构体中只能定义变量在C中结构体内不仅可以定义变量也可以定义函数。比如用C语言方式实现的栈结构体中只能定义变量现在以C方式实现会发现struct中也可以定义函数。
2.3类的定义
在C中可以使用class关键字来定义类。以下是一个简单的类的定义示例
class MyClass {private:int num;public:void setNum(int n) {num n;}int getNum() {return num;}
};上述代码定义了一个名为MyClass的类其中包含一个私有数据成员num和两个公有成员函数setNum和getNum。私有数据成员只能在类的内部访问而公有成员函数可以被外部访问。
类的两种定义方式都是常见的各有其优缺点。
1. 将声明和定义全部放在类体中的方式
优点方便代码简洁所有的类成员都可以在一个地方找到可读性好。缺点如果类体过于庞大会导致代码不易维护编译时间增加。此外如果成员函数在类中定义编译器可能会将其视为内联函数处理这可能会增加代码的体积。
示例
class MyClass {
public:void myFunction() {// 函数定义}
};2. 将类声明放在.h文件中成员函数定义放在.cpp文件中的方式
优点可以使代码更易维护类的接口和实现分离隐藏了类的实现细节方便对类进行封装。此外当多个文件需要使用同一个类时只需包含头文件而不必重新编译整个类的实现文件。缺点可能会增加一些额外的工作量需要在.h和.cpp文件中进行对应的操作有时可能会导致一些函数重复声明的问题。
示例
// MyClass.h
class MyClass {
public:void myFunction();
};// MyClass.cpp
#include MyClass.h
void MyClass::myFunction() {// 函数定义
}选择哪种方式取决于项目的具体需求和个人偏好。在较小的项目中通常将声明和定义放在类体中更为方便而在大型项目中通常将声明和定义分离以提高代码的可维护性和可重用性。
2.4 类的作用域
类的成员具有类作用域即可以在类的内部直接访问其他成员而不需要使用类名或对象名作为限定符。这使得类的成员之间可以直接交互简化了代码的编写。需要使用 :: 作用域操作符指明成员属于哪个类域。
2.5对象的创建与使用
通过类可以创建对象对象是类的实例化。可以使用以下语法创建对象
MyClass obj;然后可以通过对象来访问类中的成员函数
obj.setNum(10);
int number obj.getNum();2.6类的实例化
类的实例化是指使用类类型创建对象的过程。在这个过程中会为对象分配实际的内存空间并存储类的成员变量。类本身只是对对象进行描述的模型定义了对象具有的属性和行为但并不占用实际的物理空间。
举个例子类就像是一个建筑设计图描述了建筑的结构和特征但并不是实际的建筑物。而类的实例化就像是根据设计图建造出实际的房子创建了具体的对象并分配了存储空间来存储对象的属性值。
通过类的实例化我们可以创建多个不同的对象并分别对它们进行操作实现了代码的重用和模块化。
三 .类对象模型
3.1 如何计算类对象的大小
#include iostreamclass A
{
public:void PrintA(){std::cout _a std::endl;}
private:char _a;
};int main()
{std::cout Size of class A: sizeof(A) std::endl;return 0;
}
通常情况下编译器会对成员变量进行对齐以提高访问速度。对于大多数平台char 类型的变量通常对齐到1字节。因此在这种情况下类 A 的大小将是 _a 的大小即1字节。
3.2 类对象的存储方式猜测
对象中包含类的各个成员 缺陷每个对象中成员变量是不同的但是调用同一份函数如果按照此种方式存储当一个类创建多个对象时每个对象中都会保存一份代码相同代码保存多次浪费空间。那么如何解决呢
代码只保存一份在对象中保存存放代码的地址 只保存成员变量成员函数存放在公共的代码段
// 类中既有成员变量又有成员函数
class A1 {public:void f1(){}private:int _a;};// 类中仅有成员函数
class A2 {public:void f2() {}};// 类中什么都没有---空类
class A3{};//sizeof(A1) : 4//sizeof(A2) : 1 成员函数不占据类对象的内存空间只有一个字节//sizeof(A3) : 1注意空类的大小空类比较特殊编译器给了空类一个字节来唯一标识这个类的对象。结论一个类的大小实际就是该类中”成员变量”之和得注意内存对齐 结构体内存对齐规则 第一个成员在与结构体偏移量为0的地址处。其他成员变量要对齐到某个数字对齐数的整数倍的地址处。 注意对齐数 编译器默认的一个对齐数与该成员大小的较小值。 VS中默认的对齐数为8结构体总大小为最大对齐数所有变量类型最大者与默认对齐参数取最小的整数倍。如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍。 四. 构造函数与析构函数
构造函数是一种特殊的成员函数用于在对象创建时初始化对象的数据成员。析构函数则用于在对象销毁时释放资源。以下是构造函数和析构函数的示例
class MyClass {private:int num;public:// 构造函数MyClass() {num 0;}// 析构函数~MyClass() {// 可选的资源释放操作}
};五.成员访问权限 C中的类提供了三种成员访问权限私有private、保护protected和公有public。私有成员只能在类的内部访问保护成员可以在类的内部和派生类中访问而公有成员可以在任何地方访问。默认情况下类的成员是私有的。 注意访问限定符只在编译时有用当数据映射到内存后没有任何访问限定符上的区别
六.this指针
6.1 this指针的引出
我们先来定义一个日期类Date class Date{
public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout _year - _month - _day endl;}private:int _year; // 年int _month; // 月int _day; // 日int a;};int main(){Date d1, d2;d1.Init(2022,1,11);d2.Init(2022, 1, 12);d1.Print();d2.Print();return 0;}上述代码定义了一个日期类 Date其中包含了两个成员函数 Init 和 Print用于初始化日期和打印日期。在调用成员函数时如 d1.Init(2022, 1, 11)编译器会自动传递当前对象的地址作为隐含的参数给成员函数这个参数就是 this 指针。因此成员函数中可以通过 this 指针来访问当前对象的成员变量。
6.2 this指针的特性
this指针的类型类类型* const即成员函数中不能给this指针赋值。只能在“成员函数”的内部使用this指针本质上是“成员函数”的形参当对象调用成员函数时将对象地址作为实参传递给this形参。 所以对象中不存储this指针。this指针是“成员函数”第一个隐含的指针形参一般情况由编译器通过ecx寄存器自动传递不需要用户传递