lecture7 class
類簡介
“Class: A programmerdefined custom type. An abstraction of an object or data type.”
類:由程式設計師定義的特殊型別。是對一種物件或者資料型別的抽象
但是這個問題已經有struct
了
struct
弊端:
- 內部成員預設是
public
型 - 使用者需要初始化每個成員變數
- 將程式碼放到邏輯集合中來避免命名衝突
- 每個類有自己的名稱空間
- 呼叫/使用名稱空間的東西語法:
namespace_name::name
- 刪除總是發生在類的解構函式中的
- 解構函式定義:
Class_name::~Class_name()
- 不要顯式呼叫它。只有當
Class_name
類越界時才會被呼叫。 - 就像其他成員函式,在
.h
中宣告,在.cpp
中實現
模版類
“Fundamental Theorem of Software Engineering: Any problem can be solved by adding enough layers of indirection.” 軟體工程基本定理:任何問題都可以透過新增足夠的間接層來解決。
“The problem with StrVector” StrVector 的問題
-
設計的
vector
應該包含任何資料型別- 這可能會要建立多種類比如
IntVector
,DoubleVecor
等
- 這可能會要建立多種類比如
-
如果不想為每個型別都單獨寫一個類呢?
- 模版類
“Template Class: A class that is parametrized over some number of types. A class that is comprised of member variables of a general type/types.” 模板類:在一定數量的型別上引數化的類。由通用型別的成員變數組成的類。
“Templates don’t emit code until instantiated, so include the .cpp in the .h instead of the other way around!” 模板在例項化之前不會發出程式碼,因此將 .cpp 包含在 .h 中,而不是相反!
// vector.h
template <typename T>
class vector<T> {
T at(int i);
};
// vector.cpp
#include "vector.h"
template <typename T>
void vector<T>::at(int i) {
}
// main.cpp
#include "vector.h"
vector<int> a;
a.at(5);
以上虛擬碼在實現時會出現編譯錯誤
“What the C++ compiler does with non-template classes” C++ 編譯器對非模板類做什麼?
//main.cpp
#include "vectorint.h"
vectorInt a;
a.at(5);
-
g++ -c vectorint.cpp main.cpp
:編譯並建立 vectorint.cpp 和 main.cpp 中的所有程式碼。 vectorint.h 中的所有函式都有已編譯的實現,main 可以訪問它們,因為它包含了 vectorint.h -
“哦,看看她使用了 vectorInt::at,我很高興我編譯了所有這些程式碼並且現在就可以訪問 vectorInt::at!”
“What the C++ compiler does with template classes” C++ 編譯器對模板類做什麼?
//main.cpp
#include "vector.h"
vectorInt a;
a.at(5);
-
g++ -c vectorint.cpp main.cpp
:編譯並建立 vectorint.cpp 和 main.cpp 中的所有程式碼。 但由於vector
是模版類,這不會建立任何程式碼 -
““Oh look she made a vector<int>! Better go generate all the code for one of those!””
“哦,看她做了一個向量<int>!最好為其中之一生成所有程式碼!”
-
“不好了!我所能訪問的只是vector.h!該檔案中沒有該介面的實現!而且我無法去尋找 vector<int>.cpp!”
此時需要做出改變,將vector.cpp
的程式碼包含在vector.h
中
// vector.h
#include "vector.cpp"
template <typename T>
class vector<T> {
T at(int i);
};
// vector.cpp
#include "vector.h"
template <typename T>
void vector<T>::at(int i) {
}
// main.cpp
#include "vector.h"
vector<int> a;
a.at(5);
-
g++ -c vectorint.cpp main.cpp
:編譯並建立 vectorint.cpp 和 main.cpp 中的所有程式碼。 但由於vector
是模版類,這不會建立任何程式碼 -
““Oh look she made a vector<int>! Better go generate all the code for one of those!””
“哦,看她做了一個向量<int>!最好為其中之一生成所有程式碼!”
-
“vector.h 包含了 vector.cpp 中的所有程式碼,它告訴我如何建立一個 vector<int>::at 函式:)”