先背单词:
Object-Oriented Programming (OOP) 面向对象编程
Abstraction [æb'strækʃən] (抽象)
Polymorphism [ˌpɒlɪ'mɔ:fɪzəm] (多态)
Inheritance [ɪn'herɪt (ə) ns] (继承)
Encapsulation [ɛnˈkæpsəˌleɪʃən] (封装)
因为显得很牛逼
# 类
构成:
- 由变量定义的数据域
- 由函数定义的行为
- 两类特殊函数:构造函数 (ctor),析构函数 (dtor)
类是一种数据类型,几乎取代 C 中的 struct
不同:默认访问属性,struct 为 public,class 为 private
# 构造函数 ctor
声明在类中的构造函数,特点:
- 创建对象时自动调用
- 与类同名
- 无返回值(void 也不带)
- 可重载
不声明构造函数时,编译器会自动创建一个无参的空函数体 “默认构造函数”。
C++11 中这样强制编译器生成默认构造函数:
类名() = default; |
单参数的构造函数可能实现隐式类型转换。
# 对象
创建时时推荐使用 C++11 列表初始化便于进行窄化检查。
通过对象访问运算符 .
访问对象中的数据和函数。
对象的数据成员称实例变量,函数成员称实例函数
实例:
#include <iostream> | |
using namespace std; | |
class Circle | |
{ | |
public: | |
double r; | |
Circle() // ctor | |
{ | |
r = 1.0; | |
} | |
Circle(double radius) //ctor 重载 | |
{ | |
r = radius; | |
} | |
/* 等价写法 1 | |
Circle (double radius = 1.0) | |
{ | |
r = radius; | |
} | |
*/ | |
/* 等价写法 2 | |
double r = 1.0; | |
Circle () = default; | |
Circle (double r) | |
{ | |
this -> r = r; | |
} | |
*/ | |
double area() | |
{ | |
return r * r * 3.14; | |
} | |
}; | |
int main() | |
{ | |
Circle c1; | |
Circle c2{2.0}; | |
cout << c1.area() << ' ' << c2.area() << endl; // 3.14 12.56 | |
return 0; | |
} |
# 对象拷贝和匿名对象和类的蜜汁定义
# 对象拷贝
默认情况下,对象拷贝时,每个数据域都会被拷贝。
# 匿名对象
一次性使用的对象。无法找回
例如:
auto c = Circle{2.33}; | |
---- | |
Circle c2{}; | |
c2 = Circle{2.33}; | |
---- | |
cout << Circle{2.33}.area() << endl; |
# 局部类
在函数中声明的类,作用域仅该函数内。
# 嵌套类
类中声明类,C++ 不常用,jvav 你会吗?
# 类声明与定义分离
内联:函数在 类声明 中 实现,则自动成为内联函数。
二元作用域解析运算符: ::
,简称 “域分隔符”
实例:
#include <iostream> | |
class Circle | |
{ | |
double r; | |
public: | |
Circle(); | |
Circle(double radius); | |
double area(); | |
}; | |
Circle::Circle() | |
{ | |
r = 1.0; | |
} | |
Circle::Circle(double radius) | |
{ | |
r = radius; | |
} | |
double Circle::area() | |
{ | |
return 3.14 * r * r; | |
} | |
int main() | |
{ | |
Circle c1; | |
Circle c2{2.0}; | |
std::cout << c1.area() << ' ' << c2.area() << endl; | |
return 0; | |
} |
多文件鸽了,,以后有机会也不会来补坑。咱太菜了 QAQ
# 对象指针相关
# 动态对象创建
好像没什么新鲜的。
没有对象?自己 new 一个。
# 对象数组
也没啥新鲜的,声明数组时不要使用 auto。
实例:
#include <iostream> | |
using namespace std; | |
class Circle | |
{ | |
public: | |
double r; | |
Circle(double radius = 1.0) | |
{ | |
r = radius; | |
} | |
double area() | |
{ | |
return r * r * 3.14; | |
} | |
}; | |
int main() | |
{ | |
Circle* ptr = new Circle{2.0}; | |
cout << (*ptr).area() << endl; //. 优先级高于 * | |
cout << ptr -> area() << endl; | |
auto cptr = new Circle[3] |