[源码下载]

不可或缺 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. 将不确定变成确定~Uri文本文件不用浏览器自动打开,而是下载到本地

    回到目录 这个标题有点长,简单来说就是,对于一个文件下载来说,是否可以提示用户,让它去保存,而不是将它在浏览器中打开,在浏览器中打开有个致命问题,那就是,如果你的页面编码和文件的编码不一致时,打开的就 ...

  2. 爱上MVC~为非法进行Action的用户提供HttpStatusCodeResult

    回到目录 对一MVC来说,它有Controller和Action,其中Action用来为页面提供数据和相关逻辑,并最后将页面渲染出来,而有些action是需要一些参数的,如文章的最终页,可能需要一个I ...

  3. EF架构~linq to entity的随机排序问题

    回到目录 对于从linq to sql迁移过来的开发者,对随机排序不会感到陌生,直接为datacontext添加一个方法再配合反射就可以实现随机排序了,代码如下: /// <summary> ...

  4. Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案

    Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案 1.1. 七.什么是贝叶斯过滤器?1 1.2. 八.建立历史资料库2 1.3. 十.联合概率的计算3 1.4. 十一. ...

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

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

  6. iOS-----About Asset Catalog

    About Asset Catalogs Use asset catalogs to simplify management of images that are used by your app a ...

  7. ASP.NET MVC 拦截器IResultFilter

    在ASP.NET MVC中,有一个Result拦截器,实现ResultFilter需要继承一个类(System.Web.Mvc.FilterAttribute)和实现一个类(System.Web.Mv ...

  8. Android ListView 常用技巧

    Android ListView 常用技巧 Android TextView 常用技巧 1.使用ViewHolder提高效率 ViewHolder模式充分利用了ListView的视图缓存机制,避免了每 ...

  9. 使用uGUI制作游戏内2D动画

    在3D的游戏中制作2D的效果是一个很常见的需求,我在很早前玩过一个叫做艾尔之光的游戏,里面就大量的使用了这个技术.就像下面图片中的伤害数字,这些数字往往还是有一些动画效果在里面的,比如大小的变化,颜色 ...

  10. SSIS 对数据排序

    SSIS 对数据排序有两种方式,一种是使用Sort组件,一种是使用sql command的order by clause进行排序. 一,使用Sort组件进行排序 SortType:升序 ascendi ...