在铁人赛中,最後一个要来介绍的章节是 Class!我觉得这是所有章节中最难懂、最抽象的部分,真的是需要花点时间搞懂,那我们就开始ㄅ!
Class 是一个新的概念,有别於以往我们所介绍的 if
、for
等程序化程序设计(procedural programming),Class 属於物件导向的程序设计(object-oriented programming),Class 其实就是 C++ 中的 Struct,因为 C 语言中的 Struct 有一些缺点,因此在 C++中就有更便利的 Class 功能发明了!
首先,我们可以根据其 visibility,可以分类出 private
、public
members。
private members
只能在同个 class 中被存取。
public members
可以在任何程序中被存取。
(private, public 中的 statements 可以自己按照需求定义)
(myVector 为我所建立的 class name)
Class myVector {
private:
int n;
int* m;
public:
void init(int dim);
void print();
Constructor 会在物件被建立时自动被呼叫,而他的名字会与 class 一样,且不会回传任何东西。
若我们没有自己定义的话,编译器会自己帮我们定义一个default constructor
。
写 constructor 时,可以放在 public 或 private 中,:
private:
myVector();
public:
myVector();
destructor 在物件被消灭时被呼叫。与 constructor 不同的是,他只能被放在 public 中,如果我们没有自己定义的话系统一样会自己定义 default destructor
。若我们要自己定义的话,前面要加上~
:
Public:
~myVector();
而在 class 外,我们通常会再另外将动态记忆体释出:
myVector::~myVector() {
delete []m;
}
有的时候,我们想用 private member,这时候可以用 getter 与 setter 来取用这个变数:
class MyVector {
private:
int n;
int* m;
public:
// ...
int getN() { return n; }
void setN(int v) { n = v; }
};
如果一个变数在所有 object 中都应该要有相同的 value 就可以运用静态变数,其对全部的 object 都会保持不变。
可以从 instance function 中存取静态变数,但是不能存 static function 中存取 instance member。
Class Window {
private:
// …
static int barColor;
public:
static int getBarColor();
static void setBarColor(int color);
// …
}
int Window::barColor = 0; // 初始化,静态变数要是 global variable
int Window::getBarColor() {
return barColor;
}
void Window::setBarColor(int color) {
barColor = color;
}
另外,当我们要取用静态变数时,尽量用className::memberName
!
Static members 还有一种使用方式是计算一物件被呼叫了几次,我在这边就先不细讲。
最後,又要提到 pointer 了,一个 pointer 可以指向任一物件,例如,我们可以利用它来慛去一个物件的 address。
int main() {
myVector v(5);
myVector* ptrV = &v;
return 0;
}
如果我们设一个物件v
,而 v
中有一 instance function 叫 print()
,且我们有一个 pointer ptrA
指向物件 v
,我们可以写
(*ptrA).print()
来呼叫 print()
这个函数。
如果觉得太麻烦,可以简化成 ptrA->print()
,也就是:
int main() {
myVector v(5);
myVector* ptrV = &v;
v.print();
ptrV->print();
return 0;
}
建立 object pointers 的阵列比建立 object 的阵列来的好也更 efficient,因此我们倾向建立存 object pointers 的阵列。
以上,差不多就告一段落啦!
<<: 【从零开始的Swift开发心路历程-Day29】认识GCD多执行绪Part2
>>: 【Day 26】NumPy (3):Slicing, Copy, View, shape, Concatenate
「撰写完 dockerfile → 转成映像档 → 建立容器」的流程虽说不复杂,但随着要建立的容器一...
D20. 字串题练习 这题是之前老师出的题目但是我一直解不出来,後来看很久,还跑去问同学才解出来的,...
今天我们来介绍 DRF 的 Authentication,了解 DRF 如何加入 Authencat...
Windows Event Log & FullEventLogView LOG 是监识调查...
前言 前一天提到 v8,那就再深入一点点儿讨论 V8 是什麽 以及 它 怎麽翻译 JavaScrip...