不可或缺 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++ 标准输 ...
随机推荐
- 为什么占位符可以防止sql注入?
先看下面用占位符来查询的一句话 String sql = "select * from administrator where adminname=?"; psm = con.pr ...
- 关于python的最大递归层数详解
在阅读http://www.cnblogs.com/skabyy/p/3451780.html这篇文章的时候,实验yield的流式迭代素数的时候发现有个问题,故详细记录下来. 首先来看看python默 ...
- Jsp练习——连接数据库模拟登录
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- iOS-ARC
1. 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更 ...
- gradle.properties
gradle.properties # If this is set, then multiple APK files will be generated: One per native platfo ...
- CSS隐藏元素的N种实现方式。
1. width:0; 光有高度是不行的,还得有宽度.缺点文字隐藏不了,可以加个color:#fff和背景颜色一样就ok了,障眼法,迷惑人的,其实内容还在,如果有文字的话,还是可以触发点击事件的,这种 ...
- Nodejs中的this
以下内容都是关于在nodejs中的this而非javascript中的this,nodejs中的this和在浏览器中javascript中的this是不一样的. 在全局中的this console.l ...
- Android入门(十九)WebView
原文链接:http://www.orlion.ga/676/ WebView可以在自己的应用程序中嵌入一个浏览器来展示网页. 创建一个项目WebViewDemo,修改activity_main.xml ...
- 实现List按与一个字符串的相似度和字母顺序排序(适用于模糊查询后的排序)
因公司业务需要,自己写了一个,保存起来以后可能还会用到.如果还有更好的方法或者算法,希望大家提出来. 1.简单的相似度算法(自己想到的) 因为List中每个String都会包含一个标准的字符 ...
- java中finally和return的执行顺序
注意:return的位置... 从这几个例子中可以看到,如果try之前没有有条件的return,则try..catch..finally语句块中的语句都是顺序执行(如果try中或者catch中 有re ...