[源碼下載]
作者: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
[源碼下載]