c++--类和对象(上)

本文介绍了C++中类的概念,如何通过类提升结构体的功能,包括成员函数、成员变量的使用,访问限定符的控制,以及类的封装、实例化和内存对齐特性。重点强调了隐含的this指针在函数调用中的作用。
摘要由CSDN通过智能技术生成

1.类的引入及介绍

类是由结构体引入的,或者说类是结构体的升级版。c++兼容C语言结构体的所有用法,下面是类对于结构体的升级(以栈为例):

1.可以在结构体里定义函数,我们把类中的函数叫做成员函数,其他数据叫做成员变量。在类中定义的函数有如下特性:

1)之前初始化栈都要把栈的传参到 Init 函数中,但现在因为函数就在栈里,所以不用传有关栈的参数了(如需要其它参数,传进去便是)。在这里提一下,n是前面说到的全缺省参数,通过n可以在初始化时直接把数组空间开到合适大小,省去了扩容多次的时间,当然你也可以不穿参,这样n就是1了。

2)函数的使用:

3)成员函数不计入类的整体大小。每定义一个类都要存下函数指针这样会浪费太多空间。而为了解决这个问题,c++把类里的函数存在一个特定的公共区域(代码段),供所有对象使用。计算对象大小时不计入函数。(如果一个类中没有除函数外的数据,那么它的对象的大小是1字节,这个字节不存东西,只是表示这个对象被定义出来了

4)注意一下,一般来说函数名就是函数地址,但规定成员函数的地址是&加函数名。

2.在使用结构体时可以省略掉struct直接用结构体名字,如:

3.比起struct,c++更倾向用class定义类(包容结构体)

4.类增加了访问限定符。

访问限定符可以限定类成员是否可以在类外访问(就像这样:st1.top)。

访问限定符有三种:private,protected,public。在初阶你可以把private和protected看做都是私有(不可访问),public为公有(可以访问)。

使用:

1. public 修饰的成员在类外可以直接被访问(如:st1.Init())
2. protected private 修饰的成员在类外不能直接被访问 ( 此处 protected private 是类似的 )
3. 访问权限 作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到 } 即类结束。
5. class的默认访问权限为private,struct默认访问权限为public(因为struct要兼容C)
你可以理解为想要访问私有成员,必须要通过公有成员访问,这样可以使访问更规范。比方要取栈顶元素,有的人用st1.arr【top】,有的人用st1.arr【top-1】,因为不知道top指向栈顶元素还是栈顶元素的下一个,而我们可以通过公有成员中的取栈顶元素函数来取,这样就不用考虑那么多。
注意 访问限定符只在编译时有用,从内存角度看,没有任何访问限定符上的区别

5.类的定义和声明的分离(主要是针对函数)

分离之后会报错。
类其实是定义了一个新的作用域(类似于命名空间)。先从局部域搜索capacity,top,arr这些变量,再从全局域搜索,都没搜到他们的定义,所以我们需要告诉编译器,这些变量是Stack中的,和Init一起的。可以在Init前加上:
Stack::来表示Init是Stack里的。
这样就可以了。

2.类的封装特性

之前我们用结构体只能存数据,数据和处理数据的方法是分开的,而类让数据和处理数据的方法封装在一起,并且类可以实现访问权限的控制,只留下统一的访问路径(接口),便于管理。

就像计算机,把内部的构造用壳子包起来,只留下键盘,鼠标,等接口让我们操作。

3.类的实例化

类是一张建筑图纸,我们构造类的时候并没有为其分配空间。而定义一个类的变量就是按照这个图纸建造房子,这时候才开辟空间。定义类的变量的过程就叫类的实例化,这个变量叫做对象,一个类可以定义多个对象。

4.为什么结构体和类都要内存对齐?

由于硬件上的设计,计算机读取数据时不论数据大小一次性读取固定字节数(假设是4)

这是没有内存对齐,假设要读取int数据,就是这样的:

这是内存对齐:

效率一目了然。

知识点:#pragma pack(x)  可以把对齐数设为x(整数)。

5.隐含this指针(比较重要)

前面讲过,类里面的函数都放在公共区域,而且Print貌似也没有接受参数,那么两次调用Print函数为什么得出不一样的结果呢?答案是编译器实际上背着我们给被调用的函数传递了类的指针——this,只是我们看不到。如下:

绿色部分就是编译器省略的!!

虽然不能显式的写但在类里面可以显式的用,如下:

看,this在函数中使用并不会报错。

有关this指针的题型:

1.this指针存在哪儿?

答:this指针是被调函数的形参,而形参存在于栈区。不过有时也存在于寄存器中,方便快速取出使用。

2.this指针可以为空吗?

答:可以,只要不去解引用(使用它访问对象数据)它是不会报错的。

3.

首先,空指针问题的话,不可能报编译错误,因为它也是指针,符合语法,但是一但使用空指针就会报运行错误。

然而,分析这个题目,Printf函数不存在于对象内,所以p没有访问对象中的变量,进入Print函数后,也没使用p指针(this指针)访问对象内容,所以这个程序是正确的。

选c

4.

前面分析与第三题一样,但是,把隐藏的this显示出来,_a相当与this->a,使用了this(空指针)

选B

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值