[源码下载]

不可或缺 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 = ;
} /*
下面这个与上面那个一样
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 = ;
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(, "webabcd"); // 通过 delete pointer 来是释放内存
delete employee1;
delete employee2;
} // 对象的赋值和复制
void cppclass3_demo2()
{
CppEmployee employee1;
CppEmployee employee2(, "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 = ; // 静态属性和静态函数的使用
void cppclass3_demo3()
{
// 静态数据成员在程序启动时被分配空间(编译时会生成其分配方案),程序结束时释放空间 CppEmployeeStatic employee;
employee.Version = ; // 支持用 对象. 的方式访问静态属性 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(, );
int a = cmp1.Min(); //
int b = cmp1.Max(); // CppClass3Compare<float> cmp2(6.26f, 3.14f);
float f1 = cmp2.Min(); // 3.14
float f2 = cmp2.Max(); // 6.26
}

OK
[源码下载]

不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板的更多相关文章

  1. 不可或缺 Windows Native 系列文章索引

    [源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...

  2. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

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

    [源码下载] 不可或缺 Windows Native (17) - C++: 类与对象 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 类与对象 示例1.类的设计CppE ...

  4. 不可或缺 Windows Native (23) - C++: 虚函数

    [源码下载] 不可或缺 Windows Native (23) - C++: 虚函数 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 虚函数 示例1.基类CppHuman ...

  5. 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native

    [源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...

  6. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  7. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  8. 不可或缺 Windows Native (20) - C++: 友元函数, 友元类

    [源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...

  9. 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流

    [源码下载] 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 标准输 ...

随机推荐

  1. Java中常用修饰符使用汇总

    修饰符汇总: 一:public protected default private 修饰类,修饰方法,修饰属性,修饰代码块.  类: 顶级类只能用public 修饰,顶级类不能使用private 和p ...

  2. 谷歌大牛 Rob Pike 的 5 个编程原则

    谷歌大牛 Rob Pike 的 5 个编程原则 简介: Rob Pike,目前谷歌公司最著名的软件工程师之一,曾是贝尔实验室Unix开发团队成员,Plan9操作系统开发的主要领导人,Inferno操作 ...

  3. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

  4. iOS 屏幕适配:autoResizing autoLayout和sizeClass

    1. autoResizing autoresizing是苹果早期的ui布局适配的解决办法,iOS6之前完全可以胜任了,因为苹果手机只有3.5寸的屏幕,在加上手机app很少支持横屏,所以iOS开发者基 ...

  5. webpack配置详解

    webpack配置详解 先点个赞吧,再挨个点下面的连接,觉得不值这个赞的回来骂我啊. Webpack傻瓜式指南(一) Webpack傻瓜指南(二)开发和部署技巧 Webpack傻瓜式指南 原生的官网详 ...

  6. mongodb-$type、limit、skip、sort方法、索引、聚合

    一.$type操作符 $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 类型 数字 备注 Double 1   String 2 ...

  7. 深入理解PHP内核(二)概览-PHP生命周期与Zend引擎

    本文参考自<深入理解PHP内核>,地址:https://github.com/reeze/tipi 本文链接:http://www.orlion.ml/232/ 1.SAPI接口 SAPI ...

  8. java中异常注意的细节1

    /* public class Test{ public static void main(String[] args){ int i=0; try{ func();//区别就是该函数抛出的异常被封装 ...

  9. IOS开发-KVC

    1. 什么是kvc kvc--key-value coding,健值编码 可以通过key直接访问对象属性的value的方法 2.使用场景 kvc主要是为了让代码变的更简介明了 用的比较多的是在后台数据 ...

  10. 使用Weka进行数据挖掘

    1.简介 数据挖掘.机器学习这些字眼,在一些人看来,是门槛很高的东西.诚然,如果做算法实现甚至算法优化,确实需要很多背景知识.但事实是,绝大多数数据挖掘工程师,不需要去做算法层面的东西.他们的精力,集 ...