不可或缺 Windows Native (17) - C++: 类与对象

[源码下载]


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

posted @ 2015-06-11 08:58  webabcd  阅读(1846)  评论(2编辑  收藏  举报