必备 Windows Native (19) – C++: 对象的动态创建和刑满释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

[源码下载]

必备 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
[源码下载]