1.类和对象初步认识
我们的老朋友C语言,它是面向过程,逐步分析问题求解问题,最后通过函数调用逐步解决问题。
而C++是面向对象的,关注的是对象,将一件事情拆分成不同解决对象,利用对象与对象的联系解决问题。
举个例子:如生产并销售一件衣服,会有原料商,加工商,销售商
- C语言偏向于从头服务到尾,安排一队人,什么都自己做,会采摘原料,会加工,会销售,这叫面向过程。
- C++偏向于安排3队人,他们只需要会一种技能,比如原料商只需要会处理原料,加工商只需要会加工产品,最后运输它们自己的货物到需要的地方,就能实现生产和销售,就叫面向对象。
2. 类的定义
类是在C语言中的结构体升级而来的,C++中的类除了原本C语言中能定义变量以外,还新增了定义函数。
而C语言中结构体写为struct,C++中习惯写成class。
class为类的关键字,Test1为类的名字,{}里面是类的内容。
类体中内容称为类的成员:
- 类中的变量称为类的属性或成员变量;
- 类中的函数称为类的方法或者成员函数。
类的定义有两种:
- 声明和定义全放在类里面。(都在放类里,编译器可能会将它当做内联函数处理)
- 类声明放在.h里,定义放在.cpp里。(放在.cpp的定义需要在函数名前加类名::)
我们写函数的参数和成员变量会发现他们都一样,有些时候难以区分。所以我们在写成员变量的时候,会采取一些方式区别于函数的参数,有的会加_,如成员变量x,会变成 _x。
3. 类的限定符
C++为了实现封装的效果,运用了访问限定符,通过访问限定符,实现将部分接口对外开放,避免污染数据。
访问限定符有:
- public (公有)
- protected(保护)
- private(私有)
说明:
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- 如果后面没有访问限定符,作用域就到 } 即类结束。
- class的默认访问权限为private,struct为public(因为struct要兼容C)
4. 类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域 。
5. 如何计算类对象的大小
一个类的大小,实际就是这个类的成员变量之和。
如果类是空类,他占用一个字节,该字节是为了标识这个类对象。
6. this指针
6.1 概念
在上面代码中,Init函数被调用了两次,编译器是如何识别这两次调用的对象是谁?
这里就引入了this指针。
其实,C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针(this指针)指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
6.2 this指针的特性
- this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
- 只能在“成员函数”的内部使用。
- this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
- this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。