• 不可或缺 Windows Native (17)


    [源码下载]


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

  • 相关阅读:
    FastJson序列化枚举类
    优雅计时StopWatch
    spark算子之aggregateByKey
    scala系列列表
    iOS开发证书不受信任
    .NET Core 中的鉴权授权正确方式
    设置双击直接打开.ipynb文件
    Ubuntu18添加开机启动项
    iOS ObjectC 笔记(二)GCD
    iOS VideoToolBox decoder解码失败(12909和12911)问题解决(二)
  • 原文地址:https://www.cnblogs.com/webabcd/p/4568032.html
Copyright © 2020-2023  润新知