不可或缺 Windows Native (17) - C++: 類與對象


[源碼下載]


不可或缺 Windows Native (17) - C++: 類與對象



作者:webabcd


介紹
不可或缺 Windows Native 之 C++

  • 類與對象



示例
1、類的設計
CppEmployee.h

#pragma once 

#include <string>

using namespace std;

namespace NativeDll
{
    class CppEmployee
    {

        int Number; // 默認為 private

    private: // 以下都是 private 的
        string Name;
        bool IsMale;

    protected: // 以下都是 protected 的
        string ToString();

    public: // 以下都是 public 的
        float Salary;
        int Age;
        string Show();

        // 構造函數(constructor),不定義的話,編譯時會自動生成一個默認的不做任何事情的無參數構造函數(如果指定為 private 的話就可以禁止直接實例化,一般做單例模式的話會這么做)
        // 另外:如果聲明了帶參數的構造函數,則不會自動生成默認的無參數構造函數
        CppEmployee();
        CppEmployee(int number, string name = "webabcd"); // 可以為構造函數中的參數指定默認值(參考:CppFunction1.cpp)
        CppEmployee(int number, string name, bool isMale);

        // 析構函數(destructor),對象被銷毀時會調用,例如釋放動態分配的內存等。不需要時也可以不定義,編譯時會自動生成一個默認的不做任何事情的析構函數,析構函數的函數名與類名相同,前面有“~”
        ~CppEmployee();

    private:
        // 注:在體內定義的成員函數,系統會自動將其作為 inline 函數處理(關於 inline 函數,參見:CppFunction2.cpp)
        void Temp()
        {
            int a = 100;
        }

        /*
        下面這個與上面那個一樣
        inline void Temp()
        {
            int a = 100;
        }
        */

    };
}

CppEmployee.cpp

/*
 * CppEmployee 類
 */

#include "pch.h" 
#include "CppEmployee.h" 
#include "cppHelper.h"

using namespace NativeDll;

// “::”是作用域限定符(field qualifier)
string CppEmployee::Show()
{
    return int2string(Number) + " " + Name;
}

string CppEmployee::ToString()
{
    return int2string(Number) + " " + Name;
}

// 無參數的構造函數
CppEmployee::CppEmployee()
{
    Number = 888;
    Name = "webabcd";
}

// 有參數的構造函數,可以在聲明中為參數指定默認值
CppEmployee::CppEmployee(int number, string name)
{
    Number = number;
    Name = name;
}

// 可以通過下面這種簡單的方式,將構造函數中的參數值賦值給對象的變量
CppEmployee::CppEmployee(int number, string name, bool isMale) :Number(number), Name(name), IsMale(isMale)
{

}

CppEmployee::~CppEmployee()
{

}


2、類的使用
CppClass1.h

#pragma once 

#include <string>

using namespace std;

namespace NativeDll
{
    class CppClass1
    {
    public:
        string Demo();
    };
}

CppClass1.cpp

/*
 * 類與對象
 */

#include "pch.h" 
#include "CppClass1.h" 
#include "CppEmployee.h"

using namespace NativeDll;

// “::”是作用域限定符(field qualifier)
string CppClass1::Demo()
{
    // 定義對象的方法 1:類聲明的同時定義對象(此時也可以無類名)
    // 定義對象的方法 2:一般用如下的方法定義對象
    // class CppEmployee employee; // class 可以省去
    CppEmployee employee; // 實例化,同時分配內存空間(僅數據部分分配空間,函數部分不分配空間)

    // 可以訪問 public 的屬性或函數
    employee.Salary = 100.0f;
    employee.Show();

    // 對象的引用
    CppEmployee &employee2 = employee;
    employee2.Salary = 1000.0f;

    // 對象的指針
    CppEmployee *employee3 = &employee;
    employee3->Salary = 10000.0f;


    // 也可以這么實例化
    CppEmployee employee5(1, "webabcd"); // 實例化 1 次
    CppEmployee employee6 = { 1, "webabcd" }; // 實例化 1 次
    CppEmployee employee7 = CppEmployee(1, "webabcd"); // 實例化 2 次。CppEmployee employee7 會實例化一次,CppEmployee(1, "webabcd") 會實例化一次


    // 也可以這么實例化
    CppEmployee *employee8 = new CppEmployee(1, "webabcd"); // 實例化,並返回對象的地址
    employee8->Show();
    delete employee8;


    // 注:
    // 1、上面在 Demo 函數中實例化了很多內部對象,他們會按順序一個一個地壓入棧中,棧是 FILO 的,所以當 Demo 函數執行完畢,要銷毀其內部對象時,是按照 FILO 的順序調用析構函數的
    // 2、如果同一個類實例化了 n 個對象,則有 n 組同樣大小的空間以存放 n 個對象中的數據成員。但是,不同對象都調用同一個函數代碼段。


    return "看代碼及注釋吧";
}



OK
[源碼下載]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM