C++學習之旅:第11章 使用類
阿新 • • 發佈:2019-01-06
本次學習,知識點如下:
- 運算子過載
- 友元
- 過載
<<
運算子 - 類的自動轉換和強制轉換
- 類轉換函式
運算子過載
- 運算子過載格式, 如下所示:
// op必現是有效的C++操作符,不能虛構一個新的操作符
operator op(args)
- 過載有限制。
- 過載的運算函式不必是類的成員函式,但至少有一個運算元時使用者自定義的型別。
- 不能違背運算子的語法規則,不能修改運算子的優先順序。
- 不能建立一個新的操作符
- 部分C++操作符不允許過載
友元
- 友元函式
- 友元類
- 友元成員函式
友元函式
- 宣告友元函式方式,如下所示
class className(){
friend type method(args);
};
- 友元函式不是成員函式,所以實現友元函式時不能使用類作用域
::
,同時也不要再使用friend.。 - 儘管友元函式不是成員函式,但它具有和成員函式一樣的許可權,可以訪問類物件的所有的成員資料,包括
private
宣告的成員資料。 - 只有類宣告可以決定哪一個函式是友元,因此類可以控制哪些函式可以訪問。
- 過載運算子時,如果友元函式和類成員函式的引數一樣,則友元函式和類成員函式只能選其一。
友元類
暫時不介紹,後續章節介紹
友元成員函式
暫時不介紹,後續章節介紹
過載<<
運算子
假如我們想有第使用cout
直接打印出我們的物件,如 cout<<student;
,
但我們不可能在cout類中新增友元函式,這樣會破壞類庫。這時,我們可以在Student中過載<<
,並將該成員函式宣告為友元函式。例項如下:
//Student.h
#define GO2019_STUDENT_H
#include "string"
#include "iostream"
class Student{
private:
std:: string mName;
int mAge;
public:
Student(Student &);
Student(std::string name);
Student(std::string name, int age);
int getAge(){
return mAge;
};
std::string getName(){
return mName;
}
friend std::ostream & operator<<(std::ostream & os, const Student & student);
};
#endif //GO2019_STUDENT_H
//Student.cpp
#include "Student.h"
#include "string"
Student::Student(std::string name, int age) : mName(name), mAge(age) {}
Student::Student(Student &student) {
mName = student.mName;
mAge = student.mAge;
}
Student::Student(std::string name) {
mName = name;
}
std::ostream & operator<<(std::ostream & os, const Student & student) {
os << "Name:" << student.mName << " Age:" << student.mAge;
return os;
}
// main實現
#include "Student.h"
#include "iostream"
int main() {
using namespace std;
Student student("hbx", 24);
cout << student;
return 0;
}
類的自動轉換和強制轉換
將其他型別轉換為物件
- 只有一個引數的建構函式才能作為轉換函式。
如Student hbx = "hh"
; 程式將呼叫Student(std::string)
建構函式建立一個臨時Student物件,隨後將採用逐成員方式將臨時物件的內容複製到hbx
物件中。 - 可使用
explicit
關閉隱式轉換,但仍然允許強制轉換 - 隱藏轉換存在二義性時,編譯器將報錯
類轉換函式
將物件轉換為其他型別,如將物件轉換為基本型別
轉換函式定義如下:
operaro type();
- 可使用
explicit
關閉隱式轉換,但仍然允許強制轉換(C++11
) - 轉換函式必現是類方法
- 轉換函式不能有引數
- 當隱式轉換存在二義性時,需要顯式強制轉換