不可或缺 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++ 标准输 ...
随机推荐
- Android学习笔记50:使用WebView控件浏览网页
在Android中,可以使用Webview控件来浏览网页.通过使用该控件,我们可以自制一个简单的浏览器,运行效果如图1所示. 图1 运行效果 1.WebView 在使用WebView控件时,首先需要在 ...
- Lucene系列-facet
1.facet的直观认识 facet:面.切面.方面.个人理解就是维度,在满足query的前提下,观察结果在各维度上的分布(一个维度下各子类的数目). 如jd上搜“手机”,得到4009个商品.其中品牌 ...
- Git学习笔记(6)——Bug和Feature分支
本文主要记录了通过Git来调试Bug和添加新的功能,也就是Bug分支和Feature分支,以及分支的推送. Bug分支 通过Git,我们可以为每个Bug建立一个分支,Bug修复后,合并分支,然后将临时 ...
- MYSQL-用户操作
说明:本文主要写了,MYSQL对于用户的一些操作,有:查看用户,创建用户,权限的赋予,收回,用户的密码修改和删除. MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在U ...
- VS 2008 生成操作中各个选项的差别
近日,在编译C#项目时经常发现有些时候明明代码没错,但就是编译不过,只有选择重新编译或者清理再编译才会不出错,本着求学的态度,搜罗了下VS2008IDE中生成操作的种类以及差别,整理如下: 内容( ...
- 搭建jekyll博客
使用jekyll将markdown文件生成静态的html文件,并使用主题有序的进行布局,形成最终的博客页面. 特点 基于ruby 使用Markdown书写文章 无需数据库 可以使用GitHub Pag ...
- 日志分析系统——Hangout源码学习
这两天看了下hangout的代码,虽然没有运行体验过,但是也算是学习了一点皮毛. 架构浅谈 Hangout可以说是java版的Logstash,我是没有测试过性能,不过据说是kafka这边性能要高出L ...
- C#并行编程-并发集合
菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...
- FIR.im Weekly - 劳动节我们也没有停下来
五一到五四的节假日对勤劳的开发者们似乎是零存在,各种干货好资源也并未因假期的到来而减少,所以这周的 Weekly 依然多产. Swift 样式指南:2015年4月更新 这是 @开发技术前线 收录的由 ...
- jQuery学习-打字游戏
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...