程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 不可或缺 Windows Native (19),native19

不可或缺 Windows Native (19),native19

編輯:C++入門知識

不可或缺 Windows Native (19),native19


[源碼下載]


不可或缺 Windows Native (19) - C++: 對象的動態創建和釋放, 對象的賦值和復制, 靜態屬性和靜態函數, 類模板



作者:webabcd


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

  • 對象的動態創建和釋放
  • 對象的賦值和復制
  • 靜態屬性和靜態函數
  • 類模板



示例
1、CppEmployee 類
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、演示對象的動態創建和釋放, 對象的賦值和復制, 靜態屬性和靜態函數, 類模板
CppClass3.h

#pragma once 

#include <string>

using namespace std;

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

CppClass3.cpp

/*
 * 對象的動態創建和釋放, 對象的賦值和復制, 靜態屬性和靜態函數, 類模板
 */

#include "pch.h" 
#include "CppClass3.h" 
#include "CppEmployee.h"

using namespace NativeDll;

void cppclass3_demo1();
void cppclass3_demo2();
void cppclass3_demo3();
void cppclass3_demo4();

string CppClass3::Demo()
{
    // 對象的動態創建和釋放
    cppclass3_demo1();

    // 對象的賦值和復制
    cppclass3_demo2();

    // 靜態屬性和靜態函數
    cppclass3_demo3();

    // 類模板
    cppclass3_demo4();

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



// 對象的動態創建和釋放
void cppclass3_demo1()
{
    // 動態創建對象:new 一個對象,返回的是指向這個對象的指針(如果失敗則返回值為 0, 對應的宏 #define NULL 0)
    CppEmployee *employee1 = new CppEmployee;
    CppEmployee *employee2 = new CppEmployee(1, "webabcd");

    // 通過 delete pointer 來是釋放內存
    delete employee1;
    delete employee2;
}



// 對象的賦值和復制
void cppclass3_demo2()
{
    CppEmployee employee1;
    CppEmployee employee2(1, "webabcd");

    // 對象的賦值:同類型的對象之間可以互相賦值。對象間的賦值就是對象屬性的賦值;而他們調用的函數仍然是同一代碼,不用賦值
    employee1 = employee2;


    // 對象的復制:從無到有地復制一個對象
    CppEmployee employee3(employee1);
    CppEmployee employee4 = employee1;


    /*
     * 對象的賦值是對一個已經存在的對象賦值;對象的復制則是從無到有地創建一個新對象
     */
}



// 用於演示靜態屬性和靜態函數
namespace NativeDll
{
    class CppEmployeeStatic
    {

    public:
        static int Version; // 靜態屬性
        string Name;

        string Show()
        {
            return this->Name;
        }

        static int GetVersion() // 靜態函數
        {
            // 靜態函數中沒有 this 指針
            return Version;
        }

        string ToString()
        {
            return "abc";
        }
    };
}

// 初始化靜態屬性(必須要初始化,不然編譯出錯)
int CppEmployeeStatic::Version = 10;

// 靜態屬性和靜態函數的使用
void cppclass3_demo3()
{
    // 靜態數據成員在程序啟動時被分配空間(編譯時會生成其分配方案),程序結束時釋放空間

    CppEmployeeStatic employee;
    employee.Version = 100; // 支持用 對象. 的方式訪問靜態屬性

    int version = CppEmployeeStatic::Version; // 支持用 類:: 的方式訪問靜態屬性

    version = CppEmployeeStatic::GetVersion(); // 支持用 類:: 的方式訪問靜態函數
    version = employee.GetVersion(); // 支持用 對象. 的方式訪問靜態函數
}



// 用於演示類模板(類模板類似函數模板,函數模板參見:CppFunction2.cpp)
namespace NativeDll
{
    // template <class T1, class T2>

    // 聲明一個模板,其有一個名為 T 的不定類型(虛擬類型)
    template <class T>

    // 使用了類模板的類就是模板類
    class CppClass3Compare
    {

    private:
        T x, y;

    public:
        CppClass3Compare(T a, T b)
        {
            x = a; 
            y = b;
        }

        T Max()
        {
            return (x > y) ? x : y;
        }

        T Min();

    };
}

// 注意:要在外面定義模板類的成員函數的話,要像下面這麼寫
template <class T>
T CppClass3Compare<T>::Min()
{
    return (x < y) ? x : y;
}

// 模板類的使用
void cppclass3_demo4()
{
    CppClass3Compare<int> cmp1(2, 14);
    int a = cmp1.Min(); // 2
    int b = cmp1.Max(); // 14

    CppClass3Compare<float> cmp2(6.26f, 3.14f);
    float f1 = cmp2.Min(); // 3.14
    float f2 = cmp2.Max(); // 6.26
}



OK
[源碼下載]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved