目录
1:类的定义
在c++中定义类的关键字为class,struct也可以用来定义类。
类定义的语法:class 类名{....成员变量 ....成员函数};
struct与class定义类的语法相同.在{....}中的内容又称为类体,类体中的变量称为成员变量或类的属性,类中的函数称为类的方法或成员函数。
类定义的两种方式
1:将类的声明与定义放在不同的源文件中,声明放在.h,定义放在.cpp中,这时候我们在.cpp文件中还需要在函数面前加上类名::,用来告诉编译器这是那个成员函数是属于那个类的。需要注意的是当我们在类中定义成员函数时,这个成员函数为内联函数,但是具体展不展开就需要看编译器了。
.h文件中声明
.cpp文件中定义
2:将类的声明与定义同时放在类体中。与上面需要注意的一样,在类中定义的都是内联函数。
3.类的成员变量命名规则
在讲这个小语法之前,我们先上一段代码。
我们本来写了一个方法是想初始化我们的年月日,可是在函数内部左边的year就是我们所用的成员变量吗?很显然并不是的,因为我们知道在一个函数内部局部变量是先于全局变量的。
所以我们的c++为了不造成这样的命名冲突,所以就有了如下图代码的命名规则。
2:类的访问作用符
类的访问作用符有三种分别是:private(私有),public(公有),protected(保护).
区分私有,公有,保护的三种限定符主要的区别是在类外能否访问内部的成员函数或成员变量。
私有与保护:在类外并不能直接进行访问。 公有:在类外能够进行访问。
私有与保护肯定也是有区别的。这个知识点后续会讲。
c++实现封装的方式:用类将对象的属性和方法结合在一起,让对象更加完善,通过访问权限选择性的将接口提供给外部的用户使用。
一般而言我们对于成员变量设置为私有,成员方法(函数)设置为公有。
访问权限限定符的作用域为当前访问限定符到下一个访问限定问,如果没有下一个访问限定符,就到类结束}时.
我们通过例子来讲解这段话。
需要记住的是:class与struct都可以定义类,但是区别就在于 class默认的访问权限为私有的,struct默认的访问权限是公有的(为了支持c语言中struct的用法.)
我们可以很清楚的看到我们的d2(class定义的类)在默认的情况下是不能够进行访问的,因为class定义的类的默认访问权限是私有的是不能直接在类外进行访问的。
c++中struct与class的区别
1:两者都可以定义类,但是默认的访问权限不同,class为私有,struct为公有。
2:c++中struct还可以支持c语言中的语法。
3:类的作用域
类的定义也增加了一个作用域,因为加了这个{...},这里的作用域的语法其实在我们将类的声明与定义分离的时候常见,当他们分离的时候我们定义函数时,需要在函数名加上类名::的语法,用来告诉编译器我们的函数来自哪。
4:类的实例化
定义:用类来创建对象的过程,称为类的实例化。
其实在定义完类的时候,我们并没有直接给类进行初始化,因为类的初始化是要在内存中开辟相应的内存空间的,而我们在定义完类只是对类进行声明。
类的实例化的本质其实就是来定义类的,给类开辟相应的内存空间。
我们要注意的是,一个类可以实例化出多个对象,我们可以将类理解成设计图,而实例化出的对象可以看做房子,类vs对象 1v多。
5:类对象
1:类对象大小的计算
我们已经学过定义类了,并且也知道通过类我们可以创建出对象,那么类的大小如何计算呢?
很显然我们可以根据类的定义就知道,类中既有成员变量,又有类的方法,难道类的大小为类成员变量类型的大小加上类方法的大小就行了吗?
首先在这里我们直接公布结论,原因在下面的知识点会介绍。
类的大小=只包含成员变量的大小,但是需要考虑成员变量的内存对齐。
至于是如何对齐的其实在c语言阶段我们已经详细的讲过了,如果你有什么疑问的话,可以去看看博客中c语言结构体那一张节。
在这里我们还需要记住一个特殊的类:空类
空类它是既没有成员变量也没有成员函数,大小为1.
这个1是用来标识定义的对象存在。
我们直接通过1个例子来计算类的大小
根据结构体内存对齐的规则:
1:第一个成员在与结构体偏移量为0的地址处
2:其他成员变量需要对齐到对齐数的整数倍处
对齐数:变量的大小与编译器默认的对齐数较小的那个
3:结构体最终的大小为最大对齐数的整数倍。
4:如果含有嵌套结构体,那么嵌套结构体对齐到自己最大对齐数的整数倍处,最终的大小为所有对齐数最大的整数倍处,包括嵌套结构体中对齐数。
所以上述的答案为12.如果看了这个规则还是不会算的话,可以通过画图来理解。
类中变量的存储方式猜测
1:类中成员变量与方法都存在于类中
显然这种猜测是不成立的,因为当我们定义多个类的时候,他们方法的逻辑是一样的,如果我们给每个方法都开辟一块内存空间的话,那么就太浪费了,这种猜测显然是不合理的。
2:类中存放函数变量,方法存在公共的地方。
这种猜测其实就是类成员与变量存储的真实方式。
6:this指针
this指针是在栈区上开辟的,是一个函数的形参。但是这个函数的形参不能显示的使用但是能在函数体中使用。
我们知道当我们使用类来创建不同的对象的时候,他们都会有公共的方法,且我们通过前面的学习知道,方法是存储在一块公共的地址处的,那么我们如何来区分不同对象调用相同的函数呢?
所以c++为了解决这个问题,才引入了this指针这个语法。
我们需要知道当我们通过对象来调用相应的函数的时候,其实我们的编译器在编译的时候会将对象的地址隐藏的传过去,而在相应方法的形参中也会有一个相应的this指针存在,这里可能有点抽象我们通过相应的代码来解释。
c++this指针的定义是这样的
c++编译器会给每一个"非静态成员函数"增加一个隐藏的指针参数,让该指针指向当前的对象(那个对象在调用该函数),在函数体中所有成员变量的访问,都是通过this指针去访问的。只不过用户是透明的,是编译器在默默无闻的做这些事情的。
this指针的特性
1:this指针的类型是* const,如Date * const this ,这也另外的说明了我们的this的指向是不能改变的。
2:this指针只能在成员函数中使用。
3:this指针本质上是成员函数的形参,当对象调用该函数的时候,this为该对象的地址,所以this指针不是存在对象中的。
4:this指针是成员函数的第一个隐含的形参,不需要用户进行传递。
本章结束,感谢大家的观看!!!