简介
如何理解类和对象?
类是一种自定义数据类型,用类定义出来的变量就是对象。
格式:
数据类型 数据;
int a;
A a();
这一章的主要问题就是如何设计、实现和使用类。
设计和实现分别对应类的抽象和封装;使用即最后一步,用类实现功能。
简单地说:面向对象就是将事物定义(包括抽象和封装)成类并使用。
类的抽象和封装
抽象
计算机软件开发采用的抽象方法主要有两种:
过程抽象
结果给出了函数的名称、接收的参数和能够提供的功能。
数据抽象
数据抽象是面向对象程序设计方法,以数据为中心。
结果形成某事物的类,其中包括成员变量和成员函数。
简单来说,就是找出一个类有哪些变量和功能,但不用封装。
比如这是一个点餐系统。
封装
分为两部分:
接口
使用者看到的东西
实现
实现抽象出的类,写
.cpp
代码
简单地说,就是写代码。
比如:对老师来说,课代表就是接口,课代表怎么收作业就是实现。
提问
1 | class Cxy{ |
请找出代码里的类、对象、抽象、封装。
成员函数
常量成员函数
C++中,为了禁止成员函数修改数据成员的值,可以使用常量成员函数。
语法:
1 | class X{ |
注意:
- 只有类的成员函数才能定义为常量函数,普通函数不能。
- 常量成员函数与const参数没有关系
对象
- 每个对象的数据成员都有自己独立的存储空间。就像int变量一样。
- 注意:一个类的成员函数只有一份,所有对象共用。
- 注意:类的static成员只有一份,它并不算对象的数据成员。
构造函数设计
默认构造函数
定义
书上P97下边给的定义是最准确的。
想想之前讲的默认的含义。
简单来说:如果用类定义对象时,我们没有给参数的话,调用的就是默认构造函数。
分类
默认构造函数有两种:
不带参数的构造函数
1
A();
可以是我们自己定义的,也可以是编译器合成的。
所有形参都提供了默认值的构造函数
这个当然是我们自己定义的。
构造函数与初始化列表
初始化列表次序
初始化列表中的成员初始化次序与他们在类中的声明次序相同,与初始化列表中的次序无关。
1 | class A{ |
提问:初始化次序是什么?
初始化列表执行时间
类内初始值$\rightarrow$构造函数初始化列表$\rightarrow$构造函数体
what必须采用初始化列表?
C++11之前
一个类的
- 常量成员
- 引用成员
- 类对象成员
- 子类构造函数对基类构造函数的调用
- 等等
必须通过初始化列表进行初始化。
C++11之后
除了初始化列表,可以用类内初始值yo。
析构函数
若有几个对象同时结束生存期,析构函数调用顺序与构造函数顺序相反。
静态成员
关键字:static
。
静态成员可以是变量,也可以是函数。
注意:静态成员函数不可以访问非静态成员。think why?
意义
表示这个成员是属于整个类的。
声明和定义
示例:
1 | class Boy{ |
在类内static int number;
,仅仅是声明,
原则上,定义必须写在类外:static int Boy::boyNum;
,值默认为0,也可以进行初始化。
访问
两种方式:
通过类名访问(非静态成员不能以这种这样访问)
1
cout << Boy::boyNum << endl;
通过对象访问
1
2Boy cbh();
cout << cbhboyNum << endl;
看看下边讲的this指针?
this指针
含义
this用来标识一个对象,是该对象的地址,类型是Boy* const
,隐含在非静态成员函数的参数里。
应用
静态成员函数没有this指针,所以不可以访问非静态成员。
常量成员函数的this,类型是const Boy *
。
作者:@臭咸鱼
本文为作者原创,转载请注明出处:https://chouxianyu.github.io
欢迎讨论和交流!