不可或缺 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++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板的更多相关文章
- 不可或缺 Windows Native 系列文章索引
[源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- 不可或缺 Windows Native (17) - C++: 类与对象
[源码下载] 不可或缺 Windows Native (17) - C++: 类与对象 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 类与对象 示例1.类的设计CppE ...
- 不可或缺 Windows Native (23) - C++: 虚函数
[源码下载] 不可或缺 Windows Native (23) - C++: 虚函数 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 虚函数 示例1.基类CppHuman ...
- 不可或缺 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 ...
- 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
[源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- 不可或缺 Windows Native (20) - C++: 友元函数, 友元类
[源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...
- 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流
[源码下载] 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 标准输 ...
随机推荐
- Qt create 配置git版本管理
配置步骤: git的下载安装.(此时,您应该明白git和github的区别) 如下图1-5,Tool –> Options –> Version Control –> Git –&g ...
- Git Day03,GitHub 1st
1st, SSH key: Add a pic @ Sep 18 2016 20:26 To note the configuration process on Linux: 2nd,github网站 ...
- qqzoneQQ空间漏洞扫描器的设计attilax总结
qqzoneQQ空间漏洞扫描器的设计attilax总结 1.1. 获取对方qq(第三方,以及其他机制)1 1.2. QQ空间的html流程1 1.3. 判断是否有权限1 1.4. 2015年度Web服 ...
- WebBrowser设置Cookie
在winform里面经常会用到WebBrowser,这是一个难点就是如何设置cookies,注意,Docment对象是只读的,所以WebBrowser.Docment.cookie也就只有get方法, ...
- Lucene学习
一.全文索引的原理 数据存在形式: 1.结构化数据: 指具有固定格式或有限长度的数据,如数据库,元数据等. 2.非结构化数据(全文数据): 指不定长或无固定格式的数据,如邮件,word文档等. 3.半 ...
- 跨域API
跨域API 简单跨域请求 只需要简单的设置允许跨域就可以了 def set_default_headers(self): self.set_header('Access-Control-Allow-O ...
- apache2添加模块和添加站点
apache2添加模块和添加站点 linux下的apache2的目录和windows上的区别还是很大的,但是用起来却更方便了,详解请看另一篇文章http://www.cnblogs.com/wancy ...
- 快速入门系列--CLR--01基本概念
在.NET平台用C#这么久,自然会发现其版本很多,相应的概念也会很多,常常都是萌萌哒.而在实际工作中经常会遇到需要配置dll版本号,公钥token等场景,因而对C#.NET.CLR.框架类型等基础概念 ...
- codeforces B. Pasha and String(贪心)
题意:给定一个长度为len的字符序列,然后是n个整数,对于每一个整数ai, 将字符序列区间为[ai,len-ai+1]进行反转.求出经过n次反转之后的序列! /* 思路1:将区间为偶数次的直接去掉!对 ...
- python--爬虫入门(七)urllib库初体验以及中文编码问题的探讨
python系列均基于python3.4环境 ---------@_@? --------------------------------------------------------------- ...