简介:本课程将代领小伙伴们真正迈入C++语言的面向对象大门,在课程中,将会深入讲解类的定义方法,属性的封装方法,构造函数和析构函数等内容,并且所有知识均会通过编码实践的方式讲解到操作层面,力求帮助小伙伴们即学即会!
1 课程介绍(略)
2 类与对象初体验
2.1 c++ 类和对象
类的定义
- 关键字(class)
- 类名
- 属性(数据成员)
- 方法(成员函数)
- 访问限定符
访问限定符|说明
—|—
public|公共的(希望暴露)
protected|受保护的
private|私有的(希望隐藏)
2.2 c++ 类对象
1 | class TV |
- 从栈实例化对象
1 | TV tv; |
- 从堆实例化对象
1 | TV *p = new TV(); |
3 初始字符串类型
说明: string
类型,<string>
,命名空间为 std
。
1 | // 初始化方式 |
限制: 使用 “+” 拼接字符串时,可以用 ”hello”
,但不能连续两个都是这种形式!
1 | string s1 = "hello"; |
1 |
|
4 属性封装的艺术
4.1 c++ 属性封装之初始封装
说明: 面向对象的基本思想是,对象的属性成员不应该随便暴露,对属性成员的操作应当封装到具体的函数成员中。
1 |
|
5 精彩的类外定义
5.1 类外定义
说明: 成员函数有两种定义方式
- 类內定义:直接在类中编写函数,这是函数会尽可能编译为
inline
函数。 - 类外定义:只在类中编写函数的声明,函数的定义(实现)放在其它位置。
5.2 代码演示
说明: 以分文件方式为例。
Teacher.h
1 |
|
Teacher.cpp
1 |
|
6 对象的生离死别
6.1 构造函数讲解
问题
实例化的对象是如何在内存中存储的?
类中的代码是如何存储的?
代码和数据关系是怎样的?
内存分区
内存分区|说明|例如
—|—|—
栈区|通过普通方式创建的变量,内存分配和回收由系统控制| int x = 0;p = NULL;
堆区|动态分配内存的变量| int p = new int[20];
全局区|存储全局变量及静态变量|
常量区|存储代码中的常量和字符串字面量|string str = “hello”;
代码区|存储逻辑代码的二进制|
构造函数
- 在对象实例化时被自动调用
- 构造函数名和类名相同
- 构造函数可以有多个重载形式
- 实例化对象时仅用到一个构造函数
- 当用户没有定义构造函数时,编译器自动生成一个构造函数
- 和其它函数一样,也支持默认值
1 | class Student |
注意: 使用默认值要慎重,如果导致创建实例时计算机无法确定使用哪一个构造函数,程序会出错!
6.2 代码演示
Teacher.h
1 |
|
Teacher.m
1 |
|
6.3 练习(略)
6.4 构造函数初始化列表
说明: 可以在构造函数后面添加初始化列表
完成一些属性成员初始化的工作,特点如下
- 初始化列表先于构造函数执行
- 初始化列表只能用于构造函数
- 初始化列表可以同事初始化多个数据成员
价值:
- 相比在构造函数中初始化属性成员,初始化列表语义更明确
- const 修饰的属性成员不能在构造函数中初始化,但初始化列表可以
1 | class Circle |
6.5 初始化列表代码演示
Teacher.h
1 |
|
Teacher.cpp
1 |
|
6.6 练习(略)
6.7 c++ 拷贝构造函数
说明: 拷贝构造函数
会在对象被拷贝时调用,定义格式 类名(const 类名&变量名)
- 如果没有自定义的拷贝构造函数,则系统会自动生成一个拷贝构造函数。
- 拷贝构造函数的参数是确定的,因此不能重载。
- 当采用直接初始化或复制对象时,系统会自动调用拷贝构造函数。
- 如果对象有 const 修饰的成员,则需要在
拷贝构造函数
后面通过初始化列表
对其进行重新初始化。
拷贝构造函数被调用的场景
- 直接初始化:
Student stu3(stu1);
- 将对象赋值给其它变量:
Student stu2 = stu1;
- 作为函数参数传递(传递的是副本):
fun(stu1);
1 |
|
6.8 c++ 构造函数代码演示(略)
6.9 练习(略)
6.10 c++ 析构函数
说明: 如果说,构造函数
是对象来到世间的第一声哭泣,那么析构函数
就是对象临终的遗言。析构函数会在对象呗系统销毁时自动调用,用来归还系统的资源,收拾最后的残局。
- 如果没有自定义的析构函数,则系统自动生成一个;
- 析构函数在对象被销毁时自动调用;
- 析构函数没有返回值、没有参数,也不能重载。
定义格式: ~类名()
注意: 对象无论是在栈中定义还是堆中定义,被销毁时都会调用析构函数。
1 |
|
6.11 c++ 析构函数代码演示
6.12 练习(略)
7 课程总结
7.1 总结
7.2 综合练习
1 |
|