类与对象(一)

前言

本期,是我们类和对象第一次的学习,道友们一起来看看吧

一、面向过程与面向对象

C语言是面向过程,关注的是过程,分析出求解的步骤,逐级解决问题

C++是面向对象,关注的是对象,将一件事拆分成不同对象,靠对象间交互完成

二、类的引入

C语言中,结构体里面只能定义变量,但是C++中的结构体里不仅可以定义变量,还可以定义函数

这里用一组代码来体现

看到这里你可能会疑惑,为什么struct里面也可以定义函数,其实是C++兼容了struct的用法,且升级struct为类,实际上,在C++中一般使用的是class

1.1 类的定义

class name
{
    //成员变量和成员函数
};

class是定义类的关键字,name为类的名字,{}里为主体

类体中内容称为类的成员;类中的变量称为类的属性成员变量; 类中的函数称为类的方法或者成员函数

1.2类的两种定义方式

<1>声明定义都在都放在类体中,但需注意:成员函数在类体中定义,可能会被编译器当成内联函数处理;

<2>声明和定义分开

方法的定义放在后缀为.cpp文件中,声明放在后缀为.h的文件中

实际上,一般情况下,对于稍微复杂的程序来说都是采用第二种。

ps: 后续还是以第一种来演示

1.3 命名规则

在上面展示出的代码,可能有道友已经注意到了,为什么我的成员变量前面有"_"呢?这其实是个人的命名习惯

下面看一组代码

这样一看就会感觉很混乱,尤其是代码量多了,容易分不清哪些是成员变量,哪些是函数参数

所以为了避免这类情况发生,大家可以通过一些命名规则来区分

每个人习惯不同,不必强求某一种,但可以借鉴一下良好的命名规则,对于我们初学者来说很有用

二、类的访问限定符及封装

2.1 访问限定符

ps:如果什么都没加,默认为私有

<1> public修饰的成员,在类外可以直接被访问

<2> private和protect修饰的成员,在类外不可直接被访问

<3> 访问限定符的作用域是两个限定符之间,若后面没有限定符,那默认到}结束

<4> class默认是private,而struct默认是public(C++兼容C)

2.2 封装

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来 和对象进行交互

而面向对象的三大特性:封装, 继承, 多态。。。

关于这些知识点,这里暂时给个印象,后续我们再讨论

三、类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中,因此,在类外定义成员,需要”::”作用域操作符来指定是成员是属于哪个类域

四、类的实例化

用类类型来创建对象的过程,成为类的实例化

<1> 类是对对象的描述,类似于模型的存在,值得注意的是,定义一个类并没有分配实际的内存空间来储存它

<2> 一个类可以创建多个对象,是一对多的存在,实例化的对象是占实际的物理空间的。

这表示了,类是没有空间的

五、类对象模型

5.1 类对象的大小计算

class A
{
public:
    void Print()
    {
        cout<<_a<<endl;
    }
private:
    int _a;
}

如何计算以上面的类创建的对象大小呢?

猜想一: 对象中包含类的各个成员

猜想二: 对象包含保存存放代码的地址

猜想三: 对象包含类的成员变量,成员函数存放在公共代码段

我们来一段代码

我们可以分析出来

成员函数是不占空间的,它是放在公共代码段

实例化对象,调用的地址都一样,如果每个对象都分一份函数,那么会造成浪费

那空类为什么大小是1字节?实际上,是编译器给了空类一个字节来标识这个类的对象。

5.2 结构体内存对其规则

<1> 为什么会有要有内存对其?

当需要访问一个对象的成员变量时,有一些情况

class A
{
public:
    char _ch;
    int _i;    
};
    

                       

计算机访问内存,是以相同字节数访问的,如果没有内存对其,就可能会发生第二种情况,读取效率降低。

六、this指针

有些道友会想,对象A和对象B都调用了函数Init,但是函数Init没有区分不同对象的代码,Print也是如此,那么是怎么实现区分的呢?

这时候C++就引入了我们的this指针

C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

 所以图中的Print函数实际上是

void Print(Data* this)
{
    cout << this->_year << '/' << this->_month << '/' << this->_day << endl;
}

6.1 this指针的特性

<1> this指针的类型:类的类型* const, 所以成员函数中,不可以给this指针赋值

<2> this指针本质上是成员函数的形参, 所以对象中不存储this指针

<3> this指针只能在成员函数内部使用

<4> this指针是成员函数的第一个隐含的指针形参, 一般由编译器通过ecx寄存器, 自动传递, 不需要用户传递

尾声

本次学习就到这吧,下期,我们继续来学习类和对象

  • 59
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

emt11111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值