微网站搭建,网站怎么做301跳转,城市建设网站,扬中黄子来#x1f525;博客主页#xff1a;小王又困了
#x1f4da;系列专栏#xff1a;C
#x1f31f;人之为学#xff0c;不日近则日退
❤️感谢大家点赞#x1f44d;收藏⭐评论✍️ 目录
一、类的引入
二、类的定义
三、类的访问限定符
四、类的作用域
五、类的实例化… 博客主页小王又困了
系列专栏C
人之为学不日近则日退
❤️感谢大家点赞收藏⭐评论✍️ 目录
一、类的引入
二、类的定义
三、类的访问限定符
四、类的作用域
五、类的实例化
六、this指针
6.1this指针的引出
6.2 this指针的特性 ️前言 面向过程 C语言是面向过程的关注的是过程分析出求解问题的步骤通过函数调用逐步解决问题。用洗衣服举例。 面向对象 C是基于面向对象的关注的是对象将一件事情拆分成不同的对象靠对象之间的交互完 成。对于洗衣服这件事C设置了四个对象人、衣服、洗衣粉、洗衣机。整个洗衣服的过程就变成了人将衣服放进洗衣机、倒入洗衣粉、启动洗衣机洗衣机就会完成洗衣过程并甩干。整个洗衣服的过程是人、衣服、洗衣粉、洗衣机四个对象之间交互完成的人不需要关心洗衣机具体是如何洗衣服的。 一、类的引入 C语言结构体中只能定义变量在C中结构体内不仅可以定义变量也可以定义函数。比如 之前在数据结构初阶中用C语言方式实现的栈结构体中只能定义变量现在以C方式实现 会发现struct中也可以定义函数。
C语言版
struct Stack
{int* arr;int capacity;int size;
};struct Stack s;//声明一个结构体变量void StackInit(struct Stack* ps);void StackPush(struct Stack* ps,int x);在C语言中数据和方法分离传递参数才能访问数据没有对类型重定义只能写成struct Stack。函数名必须区分要写成StackInit在一个程序中如果有别的结构例如链表就无法区分。
C版
struct Stack
{//函数void Init(){}void Push(){}//变量int* arr;int capacity;int size;
};在C中类名就是类型不需要加struct而且不仅可以定义变量还可以定义函数。变量可以通过.去调用类里面的函数。
二、类的定义
class className
{//类体由成员变量和成员函数组成
};class为定义类的关键字ClassName为类的名字{}中为类的主体注意类定义结束时后面分号不能省略。
类体中内容称为类的成员类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
类的两种定义方式 声明和定义全部放在类体中 //定义一个人的类
class Person
{//成员函数——显式基本信息void showInfo(){cout _name - _sex - _age - endl;}//成员变量char* _name;//姓名char* _sex;//性别int _age;//年龄
};注意成员函数如果在类中定义编译器可能会将其当成内联函数处理最终是否真的是内联还是由编译器说了算。 类声明放在.h文件中成员函数定义放在.cpp文件中 Person.h文件
//定义一个人的类
class Person
{//成员函数——显式基本信息void showInfo();//成员变量char* _name;//姓名char* _sex;//性别int _age;//年龄
};Person.cpp文件
#include Person.hvoid Person::showInfo()
{cout _name - _sex - _age - endl;
}注意成员函数名前需要加类名: :告诉编译器这个函数属于哪个类域。长的函数声明和定义分离短的函数在类中定义。 三、类的访问限定符 C实现封装的方式用类将对象的属性与方法结合在一块让对象更加完善通过访问权限选择性的将其接口提供给外部的用户使用。C提供了三种限制权限的访问限定符public、protected、private。 访问限定符说明 public修饰的成员在类外可以直接被访问通过对象.访问 protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的) 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止如果后面没有访问限定符作用域就到 } 即类结束。如果后面没有访问限定符作用域就到 } 即类结束。 class的默认访问权限为privatestruct的默认访问权限为public(因为struct要兼容C)访问限定符可以修饰类中的成员变量、成员函数、内部类、重命名类型。友元函数的声明不受访问限定符的限制。 注意类定义数据一般是私有的 。
四、类的作用域 类定义了一个新的作用域类的所有成员都在类的作用域中。在类体外定义成员时需要::作用域限定符指明成员属于哪个类域。不同的类域里面可以定义同名变量。
//定义一个人的类
class Person
{//成员函数void Person();//成员变量char* _name;//姓名char* _sex;//性别int _age;//年龄
};// 这里需要指定PersonInfo是属于Person这个类域
void Person::PersonInfo()
{cout _name - _sex - _age - endl;
}如上面的成员函数PersonInfo对于函数体中出现的变量_name等编译器会先在当前函数的局部域中搜索如果没有找到接下来会到对应的类域里面去搜索当类域里面也没有的时候最后回到全局区搜索如果全局也没有编译就会报错。
五、类的实例化
用类型创建对象的过程称为类的实例化。 类是对对象进行描述的是一个模型一样的东西限定了类有哪些成员定义出一个类并没有分配实际的内存空间来存储它。类和对象的关系可以看成拿图纸建房子的过程图纸就是类建出来的一栋栋房子就是一个个的对象。 一个类可以实例化出多个对象就像一个图纸可以建成很多房子一样实例化出的对象占用实际的物理空间存储类成员变量。
class Person
{//成员函数void Person::PersonInfo()//成员变量char* _name;//姓名char* _sex;//性别int _age;//年龄
};int main()
{Person p1;//用类实例化一个对象p1Person p2;//用类实例化一个对象p2p1._name 张三;p1._sex 男;p1._age 19;return 0;
}
六、this指针
6.1this指针的引出 我们先观察下面的代码
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 main()
{Date d1, d2;//定义两个日期类d1.Init(2022, 1, 11);//给d1初始化化d2.Init(2022, 1, 12);//给d2初始化d1.Print();//调用Print函数d2.Print();//调用Print函数return 0;
}对于上述类有这样的一个问题
Date类中有 Init 与 Print 两个成员函数函数体中没有关于不同对象的区分那当d1调用 Init 函数时该函数是如何知道应该设置d1对象而不是设置d2对象呢
C中通过引入this指针解决该问题即C编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数让该指针指向当前对象(函数运行时调用该函数的对象)在函数体中所有“成员变量” 的操作都是通过该指针去访问。只不过所有的操作对用户是透明的即用户不需要来传递编 译器自动完成。 void Print(){cout _year - _month - _day endl;}void Print(Date* const this){cout this-_year - this-_month - this-_day endl;}
6.2 this指针的特性 this指针的类型类类型* const即成员函数中不能给this指针赋值。 只能在“成员函数”的内部使用. this指针本质上是“成员函数”的形参当对象调用成员函数时将对象地址作为实参传递给 this形参。所以对象中不存储this指针。 this指针是“成员函数”第一个隐含的指针形参一般情况由编译器通过ecx寄存器自动传 递不需要用户传递。 本次的内容到这里就结束啦。希望大家阅读完可以有所收获同时也感谢各位读者三连支持。文章有问题可以在评论区留言博主一定认真认真修改以后写出更好的文章。你们的支持就是博主最大的动力。