C++的泛型编程方式
1.使用类模板创建数组
下面这段代码:是创建一个元素为 T 类型的数组。
#pragma once template<class T>
class MyArray
{
public:
//有参构造
MyArray(int capacity)
{
mCapacity = capacity;
mSize = ;
pAdress = new T[mCapacity];
}
//拷贝构造
MyArray(const MyArray& my1)
{
this->mCapacity = my1.mCapacity;
this->mSize = my1.mSize;
this->pAdress = new T[mCapacity];
for (int i = ; i < mSize; i++)
pAdress[i] = my1.pAdress[i];
}
//重载等号操作符
MyArray& operator=(const MyArray& my1)
{
if (this->pAdress != NULL)
{
delete[] pAdress;
this->pAdress = NULL;
}
this->mCapacity = my1.mCapacity;
this->mSize = my1.mSize;
this->pAdress = new T[mCapacity];
for (int i = ; i < mSize; i++)
pAdress[i] = my1.pAdress[i];
return *this;
}
//重载[]号操作符
T& operator[](int index)
{
return this->pAdress[index];
} //尾插法
void pushBack(T val)
{
if (mSize == mCapacity)
return;
pAdress[mSize] = val;
mSize++;
}
//尾部删除法
void popBack()
{
mSize--;
}
~MyArray()
{
if (this->pAdress)
{
delete[] pAdress;
pAdress = NULL;
mCapacity = ;
mSize = ;
}
} private:
T* pAdress; //指向数组的指针
int mCapacity;
int mSize;
};
2.下面这段代码:是利用上面的模板创建了两个数组(一个是基本数据类型,一个是自定义的类型)
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include"MyArray.hpp" //普通类型
void test021()
{
MyArray<char> arr();
for (char i = 'a'; i <= 'j'; i++)
arr.pushBack(i);
for (int i = ; i < ; i++)
cout << arr[i]<<" ";
} //自定义类型
class person
{
public:
//无参构造
person()
{
this->mName = new char[strlen("undefined!") + ];
strcpy(this->mName, "undefined!");
mAge = -;
}
//有参构造
person(char *name, int age)
{
mName = new char[strlen(name) + ];
strcpy(mName, name);
mAge = age;
}
//拷贝构造
person(const person& p1)
{
mName = new char[strlen(p1.mName) + ];
strcpy(mName, p1.mName);
mAge = p1.mAge;
} //重载等号操作符
person& operator=(const person& p1)
{
if (mName != NULL)
{
delete[] mName;
mName = NULL;
}
mName = new char[strlen(p1.mName) + ];
strcpy(mName, p1.mName);
mAge = p1.mAge;
return *this;
}
//对 mName的赋值函数
void sendName(const char * ch)
{
if (mName)
{
delete[] mName;
mName = NULL;
}
mName = new char[strlen(ch) + ];
strcpy(mName, ch);
}
//析构函数
~person()
{
if (mName)
{
cout << "析构函数" << endl;
delete[] mName;
mName = NULL;
}
}
public:
char *mName;
int mAge;
}; //自定义类型
void test022()
{
//自定义类型必须提供默认构造函数
MyArray<person> arr();
/*for (int i = 0; i < 10; i++) //当初写这段代码时,与下面代码的区别是没有 sendName() 这个函数。此时采用这种赋值方式有两个隐患
{ //1.因为自定义的类中有无参构造函数,对对象的每个变量进行了赋值。由于其中一个变量是指针,那么此时它就具有了空间指向。
sprintf(arr[i].mName, "%d%dasafqwdqwdqwdsa%d%d", i, i, i + 1, i + 1); //2.这时直接赋值是对对象的初始化内容进行替换,并没有申请新内存,而此时对象的指针由于经过初始化,具有了
arr[i].mAge = i + 10; //固定大小的内存,一旦赋值超出其长度,就会造成内存泄漏。只有当赋值的内存小于初始化长度时,才不会造成错误。
}*/
for (int i = ; i < ; i++)
{ //这段代码是上段代码的加强版,有了sendName()这个函数,它具有两个功能,
char buf[]; //1.它把对象指针原来指向的内存空间先释放了,
sprintf(buf, "%d%dasafqwdqwdqwdsa%d%d", i, i, i + , i + ); //2.然后再重新申请赋值长度大小的内存,给他进行了赋值。
arr[i].sendName(buf); //3.由于sprintf()函数的特点,这里得创建一个缓存空间,足够大,将赋值的内容先拷贝进去,然后再把这个内存空间传入sendName()函数。
arr[i].mAge = i + ;
}
//这两段代码最主要的区别是:
.第一段赋值代码没有进行原内存的释放,但同时也没有申请新内存,一旦赋值的长度超过其初始化 mName 的内存,就造成了内存泄漏。
.第二段赋值代码增加了一个赋值函数,这个函数具有两个功能,()释放 mName 原有的内存,()对 mName 进行新内存的动态申请。
.由于这个函数所传参数的限制,以及 sprintf()函数的使用特点,只有设置一个足够大的缓冲内存,将赋值的内容先拷贝进缓冲内存,
再把缓冲内存做实参传给赋值函数,实现对 mName 的赋值。
/*person p1("john1", 19);
person p2("john2", 29);
person p3("john3", 39);
person p4("john4", 49);
person p5("john5", 59);
arr[1] = p1;
arr.pushBack(p2);
cout << "Name:" << arr[0].mName << " Age:" << arr[0].mAge << endl;
arr.pushBack(p3);
cout << "Name:" << arr[1].mName << " Age:" << arr[1].mAge << endl;*/ for (int i = ; i < ; i++)
cout << "Name:" << arr[i].mName << " Age:" << arr[i].mAge << endl;
} int main()
{
test022();
test021(); system("pause");
return EXIT_SUCCESS;
}
C++的泛型编程方式的更多相关文章
- C++泛型编程:template模板
泛型编程就是以独立于任何特定类型的方式编写代码,而模板是C++泛型编程的基础. 所谓template,是针对“一个或多个尚未明确的类型”所编写的函数或类. 使用template时,可以显示的或隐示的将 ...
- C++模板&泛型编程
---恢复内容开始--- 一.泛型编程 定义:编写与类型无关的逻辑代码,是代码复用的一种手段.模板是泛型编程的基础 模板分为:函数模板和类模板 函数模板:代表了一个函数家族,该函数与类型无关,在使用时 ...
- C++ 模板与泛型编程
<C++ Primer 4th>读书笔记 所谓泛型编程就是以独立于任何特定类型的方式编写代码.泛型编程与面向对象编程一样,都依赖于某种形式的多态性. 面向对象编程中的多态性在运行时应用于存 ...
- atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php
atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php \ 1. 泛型历史 1 由来 1 2. 泛型的机制编辑 1 机制 1 编译机制 2 3. 泛型方法定义1::前定义 ...
- C++泛型编程原理
1.什么是泛型编程前面我们介绍的vector,list,map都是一种数据结构容器,容器本身的存储结构不同,各容器中存在的数据类型也可以不同.但我们在访问这些容器中数据时,拥有相同的方式.这种方式就叫 ...
- [GeekBand] STL与泛型编程(1)
在C++语法的学习过程中,我们已经对模板有了基本的了解.泛型编程就是以模板为工具的.泛化的编程思想.本篇文章介绍了一些在之前的文章中没有涉及到的一些模板知识.泛型编程知识和几种容器.关于模板的一些重复 ...
- 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系
2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...
- C++ Primer 学习笔记_76_模板与泛型编程 --模板定义[续]
模板与泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示 ...
- C++ Primer 学习笔记_75_模板与泛型编程 --模板定义
模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模 ...
随机推荐
- 最近公共祖先 LCA 倍增法
[简介] 解决LCA问题的倍增法是一种基于倍增思想的在线算法. [原理] 原理和同样是使用倍增思想的RMQ-ST 算法类似,比较简单,想清楚后很容易实现. 对于每个节点u , ancestors[u] ...
- [转载]c++常用字符串操作函数
原文地址:c++常用字符串操作函数作者:Valsun 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source ...
- svn安装和配置
安装svn 参考http://blog.csdn.net/dl425134845/article/details/41978541 系统版本 uname -a # 查看内核/操作系统/CPU信息 he ...
- 【js】js截取字符串 +转化字符串为数字
js有两种方法可以截取字符串 substr(start , length ])和substring(start, end) parseInt('123') : 返回 123
- SDK里报错[NSConcreteMutableData wbsdk_base64EncodedString]
百度一大堆都说在这个里加个-ObjC,然后加了还是有问题 最近谷歌了下才要加入这个才正常了,国内的开发者只是一知半解的………… 如果错误还没有解决, 下面这个可以帮到你:
- java >>> 和 >>>=的区别
java >> 和 >>> 以及 >>>= 的区别 可能大家都知道java中>> 和 >>> 的区别,那这里我也啰嗦一下, ...
- julia应用于自动驾驶汽车、机器人、3D 打印、精准医疗、增强现实、基因组学、能源交易、机器学习、金融风控和太空任务设计等多个领域
编程界的新宠 Julia 发布 1.0 正式版本,多种优势集于一身2018-08-14 14:14 公司Julia 的累积下载次数超过 200 万,已被应用于自动驾驶汽车.机器人.3D 打印.精准医疗 ...
- OpenCV支持向量机SVM对线性不可分数据的处理
支持向量机对线性不可分数据的处理 目标 本文档尝试解答如下问题: 在训练数据线性不可分时,如何定义此情形下支持向量机的最优化问题. 如何设置 CvSVMParams 中的参数来解决此类问题. 动机 为 ...
- linux xfs文件系统无法用readdir获取dirent文件类型d_type则用stat获取暨stat函数讲解
stat函数讲解 表头文件: #include <sys/stat.h> #include <unistd.h>定义函数: int stat ...
- 页面优化——js异步载入
同步载入 在介绍js异步载入之前.我们先来看看什么是js同步载入.我们平时最常使用的就是这样的同步载入形式: <script src="http://XXX.com/script.js ...