• 不可或缺 Windows Native (19)


    [源码下载]


    不可或缺 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
    [源码下载]

  • 相关阅读:
    case when then 中判断null的方法
    在SELECT的时候,加入一列固定值
    拿到iframe页面里面的变量及元素的方法
    datatables 多一列报错Cannot read property 'sWidth' of undefined(…)/少一列报错Cannot read property 'style' of undefined(…)
    MySQL 显示表字段及注释等信息
    MYSQL escape用法--转义
    MyBatis insert操作返回主键
    Java关键字final、static使用总结
    数据库往表中插入数据报错
    洛谷 题解 P1287 【盒子与球】
  • 原文地址:https://www.cnblogs.com/webabcd/p/4594559.html
Copyright © 2020-2023  润新知