『C++成长记』类和对象

这篇具有很好参考价值的文章主要介绍了『C++成长记』类和对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

『C++成长记』类和对象,C++,c++,开发语言,c语言,数据结构,算法

 🔥博客主页:小王又困了

📚系列专栏:C++

🌟人之为学,不日近则日退 

❤️感谢大家点赞👍收藏⭐评论✍️


目录

一、类的引入

二、类的定义

三、类的访问限定符

四、类的作用域

五、类的实例化

六、this指针

📒6.1this指针的引出

📒6.2 this指针的特性


🗒️前言:

🎀面向过程

     C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。用洗衣服举例。

『C++成长记』类和对象,C++,c++,开发语言,c语言,数据结构,算法

🎀面向对象

     C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完 成。对于洗衣服这件事,C++设置了四个对象:人、衣服、洗衣粉、洗衣机。整个洗衣服的过程就变成了:人将衣服放进洗衣机、倒入洗衣粉、启动洗衣机,洗衣机就会完成洗衣过程并甩干。整个洗衣服的过程,是人、衣服、洗衣粉、洗衣机四个对象之间交互完成的,人不需要关心洗衣机具体是如何洗衣服的。

『C++成长记』类和对象,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.h"

void Person::showInfo()
{
    cout << _name << "-" << _sex << "-" << _age << "-" << endl;
}

注意:成员函数名前需要加类名: :,告诉编译器这个函数属于哪个类域。长的函数声明和定义分离,短的函数在类中定义。

三、类的访问限定符

     C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。C++提供了三种限制权限的访问限定符:publicprotectedprivate

『C++成长记』类和对象,C++,c++,开发语言,c语言,数据结构,算法

🎀访问限定符说明

  • public修饰的成员在类外可以直接被访问(通过对象.访问)
  • protectedprivate修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到 } 即类结束。
  • 如果后面没有访问限定符,作用域就到 } 即类结束。
  • class的默认访问权限为private,struct的默认访问权限为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;//用类实例化一个对象p1
    Person p2;//用类实例化一个对象p2
    p1._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指针的特性

  1.  this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
  2.  只能在“成员函数”的内部使用.
  3.  this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针。
  4.  this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递。

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。文章来源地址https://www.toymoban.com/news/detail-755767.html

到了这里,关于『C++成长记』类和对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】引用之带你“消除”C语言版数据结构教材的一些困惑(虽然是C++的内容,但是强烈建议正在学习数据结构的同学点进来看看)

    👀樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 引用的概念 引用的特性 引用的使用场景 引用和指针的区别 C语言版数据结构教材的解惑 不知道

    2024年02月08日
    浏览(43)
  • 软件开发中常用数据结构介绍:C语言队列

    工作之余来写写C语言相关知识,以免忘记。今天就来聊聊 C语言实现循环队列 ,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦 点赞收藏评论+关注 走一波!感谢各位的

    2024年02月11日
    浏览(46)
  • 数据结构(Java实现)-包装类和泛型

    包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了 一个包装类型。 基本数据类型和对应的包装类 装箱和拆箱 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中 拆箱操作,将 Integer 对象中

    2024年02月11日
    浏览(38)
  • 数据结构中: 一元多项式的运算(相加,相减,相乘)------用C语言 / C++来实现。 数据结构线性表的操作和应用(顺序存储)

    线性表的操作和应用(顺序存储)。用顺序存储实现一元多项式,并进行加、减、乘运算。 (1)一元多项式结构体创建  (2)初始化 (3)一元多项式赋值             (4)打印一元多项式 (5)加法运算                        (6)减法运算 (7)乘法运算    全部代

    2024年02月01日
    浏览(57)
  • 05-1_Qt 5.9 C++开发指南_Model/View结构基础(基本原理;数据模型;试图组件;代理)

    Model/View(模型/视图) 结构是 Qt 中用界面组件显示与编辑数据的一种结构,视图 (View)是显示和编辑数据的界面组件,模型 (Model) 是视图与原始数据之间的接口。 Model/View 结构的典型应用是在数据库应用程序中,例如数据库中的一个数据表可以在一个 OTableView 组件中显示和编辑。

    2024年02月17日
    浏览(46)
  • Redis数据结构与对象-字符串对象SDS

    Redis没有使用C的字符串,而是自己构建了简单动态字符串(Simple Dynamic String),简称SDS。通过这种字符串格式能够对redis字符串操作进行提速。下面介绍原理。 sds数据格式如下: 比如,一个sds 中存的是 “Redis” ,那么buf 中是一个char型的数组,存5个字符R, e,d,i,s len =5;free

    2023年04月16日
    浏览(46)
  • 【数据结构】Java对象的比较

    作者主页: paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏:

    2024年02月08日
    浏览(57)
  • <C++> 类和对象-面向对象

    C语言是 面向过程 的,关注的是过程,分析出求解问题的步骤, 通过函数调用逐步解决问题。 C++是基于 面向对象 的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函

    2024年02月14日
    浏览(44)
  • <C++> 类和对象(上)-面向对象

    C语言是 面向过程 的,关注的是过程,分析出求解问题的步骤, 通过函数调用逐步解决问题。 C++是基于 面向对象 的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函

    2024年02月11日
    浏览(50)
  • C++——类和对象(2)

    当一个类中什么都没有,编译器会帮类自动生成6个默认成员函数例如: 此篇文章主要围绕构造函数与析构函数进行讲解。  对于以上的Date类,每次实例化对象之后都要对对象调用Init()函数,比较繁琐,其实编译器就可以帮我们完成。 构造函数是一个特殊的成员函数,名字与

    2024年03月17日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包