1. 程式人生 > >C++學習之旅:第11章 使用類

C++學習之旅:第11章 使用類

本次學習,知識點如下:

  • 運算子過載
  • 友元
  • 過載<<運算子
  • 類的自動轉換和強制轉換
  • 類轉換函式

運算子過載


  1. 運算子過載格式, 如下所示:
// op必現是有效的C++操作符,不能虛構一個新的操作符
operator op(args)
  1. 過載有限制。
    • 過載的運算函式不必是類的成員函式,但至少有一個運算元時使用者自定義的型別。
    • 不能違背運算子的語法規則,不能修改運算子的優先順序。
    • 不能建立一個新的操作符
    • 部分C++操作符不允許過載

友元


  • 友元函式
  • 友元類
  • 友元成員函式
友元函式
  1. 宣告友元函式方式,如下所示
class className(){
    friend type method(args);
};
  1. 友元函式不是成員函式,所以實現友元函式時不能使用類作用域::,同時也不要再使用friend.。
  2. 儘管友元函式不是成員函式,但它具有和成員函式一樣的許可權,可以訪問類物件的所有的成員資料,包括private宣告的成員資料。
  3. 只有類宣告可以決定哪一個函式是友元,因此類可以控制哪些函式可以訪問。
  4. 過載運算子時,如果友元函式和類成員函式的引數一樣,則友元函式和類成員函式只能選其一。
友元類

暫時不介紹,後續章節介紹

友元成員函式

暫時不介紹,後續章節介紹

過載<<運算子


假如我們想有第使用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;
}

類的自動轉換和強制轉換


將其他型別轉換為物件

  1. 只有一個引數的建構函式才能作為轉換函式。
    Student hbx = "hh"; 程式將呼叫Student(std::string)建構函式建立一個臨時Student物件,隨後將採用逐成員方式將臨時物件的內容複製到 hbx 物件中。
  2. 可使用explicit 關閉隱式轉換,但仍然允許強制轉換
  3. 隱藏轉換存在二義性時,編譯器將報錯

類轉換函式


將物件轉換為其他型別,如將物件轉換為基本型別

轉換函式定義如下:

operaro type();
  1. 可使用explicit 關閉隱式轉換,但仍然允許強制轉換(C++11
  2. 轉換函式必現是類方法
  3. 轉換函式不能有引數
  4. 當隱式轉換存在二義性時,需要顯式強制轉換