【C++语法】类和对象(1)
3.类和对象(1)
对象的概念
C语言是面向过程的,注重解决问题的过程,而C++是面向对象的,注重解决问题时有几个对象参与
类的定义
-
在C语言中struct往往用于定义结构体,而在C++中不仅可以兼容C语言的用法,还可以定义类。区别在于结构体中只能定义变量,而在类中既可以定义变量,也可以定义函数。
typedef int SLTDataType; typedef struct SList_C {//每一个节点存放的数据SLTDataType data;//指向下一个节点的地址struct SList_C* next; }
这是用C语言定义的结构体
-
但是通常在C++中我们通常不会用struct来定义类,而是用另一个关键字calss,用struct和class来定义类会有一点不同,这里我们就要引入另一个概念叫做类的访问限定
类的访问限定
我们在定义好类之后需要合理使用类中的成员变量和成员函数,为了防止其他人不小心修改成员变量的值,我们通常会指定访问成员变量的途径,比如使用规定的成员函数进行访问,为了防止非法访问成员变量,我们会给成员加上访问限定。
要点:
-
访问限定需要访问限定符,如图所示,public表示可以在类之外的作用域使用,protect和private都表示只能在类之内使用;
-
在类中使用访问限定符,从该访问限定符到下一访问限定符之间的成员变量,都满足该限定条件,如果没有下一访问限定符,则范围持续到类结尾
-
如果类中没有访问限定符,class定义的类默认访问权限为private,struct定义的类默认访问权限为public(因为要兼容C)
问题:C++中struct和class的区别是什么?
解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。注意:在继承和模板参数列表位置,struct和class也有区别,后序给大家介绍。
示例代码:
上面代码为用C++定义的类来实现栈的一部分,相较于C语言实现栈,用类实现栈的区别:
-
在类中可以定义函数而且这个函数可以直接使用类中定义在函数之外的成员变量,不需要再进行传参,对此最好用之前C语言实现的栈进行区分
-
定义类时需要注意:
class为定义类的关键字,ClassName为类的名字,0中为类的主体,注意类定义结束时后面分
号不能省略。 -
除了类的定义有两种方式:
1>就像上面的代码一样,定义和声明全部放在类体中,需要注意是:成员函数如
果在类中定义,编译器可能会将其当成内联函数处理
2>定义和声明分开,成员函数声明在类中,定义在类外,此时在类之外定义成员
函数需要像命名空间一样指定作用域
C++中,类这一种数据结构体现了C++面向对象的三大特性的其中一种:封装
封装是将对象和对象的使用方法进行有机结合,并且隐藏对象的基本属性,只公开使用对象的接口实现与对象的交互。封装实际上是一种数据管理,让用户更方便的使用类。
面向对象的三大特性:多态、继承、封装;不只是C++只要是面向对象的语言都会有这三大特性
类的作用域
**之前我们学了命名空间,命名空间有自己的作用域,在作用域之外使用命名空间中定义的变量,函数,需要指定命名空间。类也是一样,创建一个类,每个类也有自己的作用域,在作用域之外使用类中定义的函数,需要指定作用域。**比如之前用声明和定义分离的方法定义类,在类之外定义类中的成员函数时要指定作用域。
类的实例化:
类的实例化就是用已经定义的类创建变量(对象)的过程,一种类可以创建多个对象,就像结构体一样,定义结构体只是定义了一个模板,编译器不会给这个模板开辟内存空间,而用结构体创建对象时,才会向内存中申请空间
类的储存空间大小
- 类的实例化后,编译器会为创建的对象申请内存空间,同一类创建的不同对象的成员变量会单独有自己的内存空间但同一类创建的不同对象的成员函数会放在公共代码段,并不像成员变量一样申请单独的空间。防止空间浪费
- 类的储存也存在内存对齐,内存对齐的规则与结构体的对齐规则一致
结构如图所示:
验证:
函数调用时,函数调用的地址一致他们调用的是一个函数
特例:
即便没有成员变量,类的大小也有1字节,这一个字节不用来存放数据,仅用来标识对象被定义出来
this指针
- 从前面的内容可知同一个类实例化的对象他们调用的都是同一个函数,但在通过不同的对象(被同一个类定义)使用类中声明的函数时,结果往往不会相同,存在这样的结果是因为C++编译器给每一个“非静态的成员函数”的参数都增加了一个指针变量—this指针
- C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
如下图所示:被注释掉的代码就是编译器自动完成的关于this指针的传递过程
this指针的特性
-
this指针的类型为[类名]*const,this指向谁不可以修改,但可以修改指向对象的内容。
-
使用者不可以自己定义this指针但可以在成员函数中使用this指针
-
this指针本质上是“成员函数”的形参,当成员函数被调用时,会将调用对象的地址作为实参传给成员函数。对象中不储存this指针
-
this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递
补充
存this指针
- this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递
[外链图片转存中…(img-HCyhq8M7-1745672165900)]