做螺杆比较出名的网站,网络营销的推广方式有哪些,个人养老保险怎么买最划算,建设母婴网站的总结【C笔记】C之类与对象#xff08;上#xff09; 1、类是结构体的升级2、类中可以定义的东西3、类访问限定符4、类的声明5、类的实例化(定义)6、类的大小的计算7、this指针 1、类是结构体的升级
C的一个显著特征就是兼容C语言#xff0c;所以C把结构体“升级”成了“类”笔记】C之类与对象上 1、类是结构体的升级2、类中可以定义的东西3、类访问限定符4、类的声明5、类的实例化(定义)6、类的大小的计算7、this指针 1、类是结构体的升级
C的一个显著特征就是兼容C语言所以C把结构体“升级”成了“类”之所以是“升级”是因为在C中的结构体及支持以前C语言的结构体的玩法也可以支持C中类的玩法。 例如单链表节点这个类我们既可以写成纯C版本 用纯C的写法我们每次要定义一个节点变量的时候都必须要加上一个前缀struct非常的麻烦。 而且就算是我们用了typedef在结构体内部也还是不能直接用typedef后的符号因为在结构体内部typedef还没有起作用
非常麻烦 但在C中我们就不必要担心这些情况因为在C中结构体也被当成了类而类是直接可以类名来定义变量的 不管类内部还是外部我们都可以直接使用类名来定义变量。
2、类中可以定义的东西
既然类是结构体的“升级”那么内在结构体中定义的东西也一定能在类中定义所以类中能定义的包括 各种变量 数组 还有枚举和结构体等等 几乎可以定义所有的东西
但C的类除了可以定义以上这些东西之外还一个定义一个类独有的东西“成员函数” 有了成员函数我们在管理结构体中的各个成员的时候就可以更方便而不需要每写一个函数就需要传参。 例如栈这个类的初始化 这是因为类划分了一个“类域”在成员函数被调用的时候就回到类中去寻找各个变量这就不需要我们老是传递参数了。 而且使用起来也很简单就像以前结构体访问成员变量一样 而这个“public”是一个类访问限定符。
3、类访问限定符
在一个类中我们总有些东西是不想被外面访问到的也总有一些东西是想要对外开放的这时候就需要访问限定符来管理了。 访问限定符一共有三个
public(公有)
protected(保护)
private(私有)第一个public表示公开由这个访问限定符修饰的成员不管是在类内部还是外部都可以自由访问 而第二个protected我们现在暂且认为它和public是一样的因为这个访问限定符实在以后的类的继承中才能显现出区别的。 第三个private表示私有被这个访问限定符所修饰的成员就只能在类里边访问而在类外边是访问不到的
而要是我们不显示的添加访问限定符在类和结构体中也是有默认的访问限定符的。 其中类的默认访问限定符是private 而结构体的默认访问限定符是public
4、类的声明
大家是否有过一个疑问就是我们平时写的这样一个类 它到底是声明还是定义呢 首先我们要明确声明和定义的区别声明只是告诉编译器有这么一个函数或变量存在而定义则是为这个函数或变量开辟空间。 所以我们就可以想接下来这样来验证上面所写的到底是声明还是定义 我们发现用域作用限定符是访问不到成员的这就说明编译器并没有为这个类开辟空间。所以编译器找不到这个成员的地址。
5、类的实例化(定义)
有声明就得有定义其实我们平时创建的一个类对象就是一个类的定义也称为类的实例化
这样编译器才会真正开辟空间。
6、类的大小的计算
其实类的大小计算遵循着结构体内存对齐的规则例如下面这两个类和结构体 从结果就可以看出类大小的计算也是遵循着结构体内存对齐的那套规则的。 同时不管我们是使用类名来计算的小还是使用类对象来计算大小都是可以准确算出一个类的大小的
这是因为就算我们没有实例化类对象但通过类名我们还是可以找到类的声明类的生命虽然没有开辟空间但也相当有了一张“图纸”我们可以通过这张“图纸”来计算出类的大小。
但是有一点是不一样的就是当类中存在成员函数的时候
我们发现就算类中添加了成员函数类的大小还是没有发生改变这是为什么呢 其实这是一种节约资源的做法我们不妨先想一想我们平时定义的各个类对象他们的成员变量是否是相同的变量 答案显然不是的。 但它们所调用的函数是不是同一个呢 答案是是的因为函数的逻辑都是一样的而各个对象的成员变量的值是可能各不相同的不相同的只当然不能共用同一个变量了但是相同的逻辑就只需要一段相同的指令就行了。 所以类中就没有必要存储成员函数了。类中的成员函数其实是放在代码段中的。
但要是我有一个“空类”也就是类中没有成员变量也没有成员函数那这个类的大小又该是多少呢 我们可以来验证一下 我们可以看到空类的大小是1字节。 其实这一字节的作用只是用来占位而已只是表示这个类存在过。
7、this指针
经过前面的叙述我们已经知道成员函数并不存储在类中。那么问题来了既然不存储在类中那么在调用的时候就必定需要传参啊那为什么在写成员函数的时候不需要传递成员变量呢
其实所谓的“不用传参”只是表面现象而已其实只是把传递对象的工作交给了编译器来做而已。 事实上我们平时写的成员函数还有一个隐藏的参数“this”指针这个指针是一个类对象的指针也就是调用函数的对象的指针 例如下面这个函数编译器会在底层将它处理成这样的一个函数 但这是规定给编译器做的工作也就是说我们不能和编译器“抢工作”不能显示的将this指针写在参数列表中。
但我们却可以在类当中使用它例如上面的这个函数也可以这样写 但是像这种单纯访问成员变量的情况我们一般都不会显示的将this写出来因为编译器自己会自动补上何必自己给自己找麻烦呢