一. 面向对象设计
1.1 类与实例
这里所说的类是我们生活中物以聚类的类,是分门别类的类,是多个类似事物组成的群体的统称,而类的个例就叫做实例。
可以认为:类是某个特定的群体,实例是群体中某个具体的个体
例如:狗是一个类,秋田犬和忠犬八公是狗这个类中的两个实例
1.2 属性与方法
我和你都是中国人
这句话隐藏着一个共识,我和你都属于中国人这个类,所以我和你这两个实例存在一些共同点。例如:黑眼睛、黄皮肤、用筷子吃饭、会讲汉语
这些共同点就是我们区别于其它类的关键,这些共同点细分的话可以分为两类
- 描述事物是怎样的,有什么特征,比如黑眼睛、黄皮肤
- 描述事物能做什么,有哪些行为和作用,比如能用筷子吃饭、会讲汉语
在编程世界中,我们把第一种共同点叫做属性,第二种共同点叫做方法
在 C++ 中,每个类都有自己独特的属性和方法,这些属性和方法是我们根据客观存在做出的抽象总结,是这个类的所有实例都共享的,即每个实例都可以调用类中的所有属性和方法
二. string
string 是标准库中的一个类,定义在命名空间 std 中,它对字符串常用的需求功能进行了封装,使得操作起来更方便,相比 C 语言中的字符数组,更不容易出错
2.1 定义和初始化 string 对象
string str_1; # 默认初始化,str_1 是一个空串
string str_2(str_1) # str_2 是 str_1 的副本
string str_3("hello") # str_3 是字符串字面量 "hello" 的副本
string str_4(n, 'c') # 将 str_4 初始化为 n 个字符 c 组成的串
#include <iostream>
#include <string>
using std::string;
using std::cout;
int main(void){
string str_1;
cout << "str_1: " << str_1 << '\n';
string str_2("hello");
cout << "str_2: " << str_2 << '\n';
string str_3(str_2);
cout << "str_3: " << str_3 << '\n';
string str_4(6, '6');
cout << "str_4: " << str_4 << '\n';
return 0;
}
将 string 类型转换为 C 风格的字符串,即字符数组。使用 string 的 c_str 方法
#include <cstdio>
#include <string>
using std::string;
int main(void){
string str_1("hello, world");
printf("%s\n", str_1.c_str());
}
三. 类的创建
在 C++ 中,使用关键字 class 去创建一个类
#include <cstdio>
#include <string>
using std::string;
class Person{
private:
string color_eye;
string color_skin;
public:
Person(const string &color_eye, const string &color_skin)
:color_eye(color_eye), color_skin(color_skin){}
public:
void show(void){
printf("I have %s eyes and %s skin.\n", color_eye.c_str(), color_skin.c_str());
return;
}
};
int main(void){
Person me("black", "yellow");
me.show();
return 0;
}
3.1 访问权限
在一个类中,访问权限有 private、public、protect
- 定义在 public 说明符之后的成员通过这个类在整个程序内可被访问
- 定义在 private 说明符之后的成员只能被类的成员函数访问
protect 与派生类有关,我们之后再讲
3.2 构造函数
一个类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数,无论何时,只要一个类的对象被创建,就会执行构造函数
构造函数的名字和类名相同,只是和其它函数相比,没有返回类型,除此之外类似于其它的函数
一个类有三个特殊的构造函数,分别是默认构造函数、拷贝构造函数,移动构造函数
3.2.1 默认构造函数
一个类如果没有显式地定义任何的构造函数,那么编译器就会为我们隐式地定义一个默认构造函数,编译器创建的构造函数又被称为合成的默认构造函数
合成的默认构造函数只适合非常简单的类,我们也可以定义自己的默认构造函数,默认构造函数的参数列表为空
Person(){
printf("I'm default constructor\n");
}
如果你既需要其它形式的构造函数,又需要默认构造函数,并且希望这个默认构造函数的作用等同于编译器合成的默认构造函数,那么执行下面这条语句即可
Person() = default;
其它两个特殊的构造函数:拷贝构造函数和移动构造函数,我们之后再讲
3.2.2 构造函数初始值列表
在构造函数中,冒号以及冒号和花括号之间的代码,被称为构造函数初始值列表,它负责为新创建对象的一个或几个属性赋初值
每个属性后面紧接括号,括号里面是我们要赋的初值,不同属性之间通过逗号分隔
3.3 class 与 struct
在 C++ 中,关键字 struct 除了可以用来创建结构体外,还可以用来创建类。它和 class 的唯一区别就是默认访问权限不一样。
- struct 的默认访问权限是 public 的
- class 的默认访问权限是 private 的
3.4 this 指针
在 C++ 中,this 指针是每一个类都自带的一个指针,它是指向该类的非常量的指针常量
printf("I have %s eyes and %s skin.\n", this->color_eye.c_str(), this->color_skin.c_str());
3.5 课堂练习
创建一个名为 Restaurant 的类
- 设置 3 个属性:restaurant_name、cuisine_type 和 number_served,为 restaurant_name、cuisine_type 设一个默认值
- 设置一个方法 open_restaurant, 打印一条信息,指出餐馆正在营业
- 设置一个方法 set_number_served,它能够设置就餐人数
- 设置一个方法 describe_restaurant, 打印 restaurant_name、cuisine_type、number_served这 3 条信息
- 创建类的实例,测试你创建的类
作业
1. 设计一个类,将一个罗马数字转换为整数,字符串使用 string 类型