类模板

智能指针类模板

老子叫甜甜 提交于 2020-02-14 01:48:24
文章目录 1 智能指针介绍 1.1 智能指针的意义 1.2 STL中的智能指针 1.3 Qt中的智能指针 2 创建智能指针类模板 1 智能指针介绍 1.1 智能指针的意义 智能指针具有如下意义: 现代C++开发库中最重要的类模板之一。 C++中自动内存管理的主要手段。 能够很大程度上避开内存相关的问题。 1.2 STL中的智能指针 STL中的智能指针auto_ptr: 生命周期结束时,销毁指向的内存空间。 不能指向堆数组,只能指向堆对象(变量)。 一片堆空间只属于一个智能指针对象。 多个智能指针对象不能指向同一片堆空间。 编程实验:auto_ptr使用初探 # include <iostream> # include <string> # include <memory> using namespace std ; class Test { string m_name ; public : Test ( const char * name ) { cout << "Hello, " << name << "." << endl ; m_name = name ; } void print ( ) { cout << "I'm " << m_name << "." << endl ; } ~ Test ( ) { cout << "Goodbye, " << m_name << ".

单例类模板

荒凉一梦 提交于 2020-02-10 01:06:49
单例类模板程序 Singleton.h #ifndef _SINGLETLON_H_ #define __SINGLETLON_H_ template <typename T> class singletlon { static T* Instance; public: static T* Get_Instance(); }; template <typename T> T* singletlon<T>:: Instance = NULL; template <typename T> T* singletlon<T>::Get_Instance() { if (Instance == NULL) { Instance = new T(); } return Instance; } #endif main.cpp #include <iostream> #include <string> #include "Singletlon.h" using namespace std; class SObject { friend class singletlon<SObject>; SObject() { } SObject(const SObject& obj); SObject& operator = (const SObject& obj); public: void print();

C++学习(16)—— 类模板

眉间皱痕 提交于 2020-02-09 12:55:36
1.类模板语法 类模板作用: 建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。 语法: template<typename T> 类 解释: template —— 声明创建模板 typename —— 表明其后面的符号是一种数据类型,可以用class代替 T —— 通用的数据类型,名称可以替换,通常为大写字母 #include<iostream> #include<string> using namespace std; //类模板 template<class NameType, class AgeType> class Person{ public: Person(NameType name, AgeType age){ this->m_name = name; this->m_age = age; } void showPerson(){ cout << "name: " << this->m_name << " age:" << this->m_age << endl; } NameType m_name; AgeType m_age; }; void test01(){ Person<string,int> p1("alice", 18); p1.showPerson(); } int main(){ test01(); return 0;

自用C++图的类模板

与世无争的帅哥 提交于 2020-02-08 19:13:45
图的实现:使用邻接矩阵 使用方法: 创建类实例: template <typename IndexType,typename DataType> class Graph{ public: Graph() {}//构造函数 Graph(const Graph&);//复制构造函数 Graph& operator=(const Graph&);//赋值函数 Graph(Graph&&);//移动构造函数 Graph& operator=(Graph&&);//移动赋值函数 void show();//显示图 bool insert(IndexType, DataType, IndexType, bool = false);//插入 bool del(IndexType, IndexType, bool = false);//删除 bool update(IndexType, DataType, IndexType, bool = false);//更新 void clear() { name2dex.clear(); dex2name.clear(); mat.clear(); }//清空 DataType shortestpath(IndexType,IndexType);//求最短路径 std::pair<bool, std::vector<IndexType>>

数组类模板

青春壹個敷衍的年華 提交于 2020-02-08 16:30:26
模板参数可以是数值型参数(非类型参数) template <typename T,int N> void func() { //使用模板参数定义局部数组 T a[n]; } 数值型模板参数的限制 变量不能作为模板参数 浮点数不能作为模板参数 类对象不能作为模板参数 本质:模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确认。 有趣的题目:使用最高效的方法求1+2+3+4+...+N的值! 答案 #include <iostream> #include <string> using namespace std; template <int N> class Sum { public: static const int value = Sum<N - 1>::value + N; }; template < > class Sum <1> { public: static const int value = 1; }; int main() { cout << "1+2+3+4+....+100=" << Sum<100>::value << endl; } 数组类模板范例程序 mian.cpp #include <iostream> #include <string> #include "Array.h" using namespace std; int main

C++ - STL - queue

一个人想着一个人 提交于 2020-02-08 01:50:05
C++ - STL - queue 整理笔记 一 基本概念:    queue是一种 先进先出 的数据结构,有两个出口,一端新增元素,另一端移除元素; 队列中只有队头和队尾才可以被外界使用,因此队列不 允许有遍历行为 。   c++队列模板类的定义在<queue>头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为 deque 类型。 二 头文件    #include<queue> 三 定义一个 queue类队列    queue<类型> 名字; 四 相关函数 ( 1)push() 在末尾加入一个元素 #include <iostream> #include <queue> using namespace std; int main() { queue<int> q; q.push(1); q.push(2); cout<<q.front()<<endl; return 0; }   输出:1 ( 2)front()返回队列第一个元素的引用。注意:只是返回第一个元素的值,并没有删除! #include <iostream> #include <queue> using namespace std; int main() { queue<int> q; q.push(1); q.push(2); cout<<q

类模板深度剖析

隐身守侯 提交于 2020-02-07 21:40:44
多参数类模板,类模板可以定义多个不同类型的参数 template <typename T1,typename T2> class Test { public: void add(T1 a,T2 b); } //使用方式 //需要指定每一个类型参数 //int --->T1 //float--->T2 Test<int,float> t; 令人惊讶的特性:类模板可以被特化 指定类模板的特定实现 部分类型参数必须显示指定 根据类型参数分开实现类模板 如下图所示,我们指定实际类型参数时,如果T1,T2是相同的类型,编译器会优先选择右边的类模板的实现,这两个类模板不会发生同名冲突的问题,编译器会把它们理解为同一个模板,只是根据类型参数来选择是使用哪一个模板。 类模板的特化类型 部分特化---用特定规则约束类型参数(即使特殊了,参数仍然是一个泛指类型) 完全特化---完全显示指定类型参数 如下图所示为完全特化:如果要使用Test类模板的时候完全显示指定泛指类型T1,T2都为int的时候,编译器会选择使用右边的完全特化的类模板来实现。 类模块特化注意事项 特化只是模块的分开实现,本质上是同一个类模块。 特化模块的使用方式是统一的,必须是显示指定每一个类型参数 范例程序 #include <iostream> #include <string> using namespace std;

特化与重载

◇◆丶佛笑我妖孽 提交于 2020-02-06 05:50:59
现在我们已经知道如何使一个泛型定义扩展成一些相关的类家族和函数家族。但是有些时候,我们需要同一个名字的函数的不同实现( 透明定义 ),为的是在不同情况下获得较高的性能,在这种情况下就不是简单的参数替换就能够解决的。 一、透明定义使用的技术 对于函数模板使用的透明定义的技术是: 函数模板的重载 对于类模板的使用透明定义的技术是: 类模板的特化(全局特化和局部特化) 二、重载函数模板 两个名称相同的模板可以同时存在,还可以对他们进行实例化。 template<typename T> int f(T) { retrun 1; } template<typename T> //重载版本 int f(T*) { return 2; } 如果我们用int*来替换第一个模板参数T,用int来替换第二个模板参数T,那么将会获得两个具有相同参数类型和返回类型的同名函数。 int main() { cout << f<int*>((int*)0) << endl; //这里回实例化出两个实体,根据实参(int*)选择接近的 cout << f<int>((int*)0) << endl; //这里会实例化出两个实体,根据实参(int*)选择接近的 } 注意:表达式0是一个整数,而不是一个null指针常量。只有在发生特定的隐式转型之后参会成为一个null的指针常量

C++ 模板何时被实例化

匆匆过客 提交于 2020-02-06 05:30:07
今天编程时碰到一个问题,写了一个单例的类模板,之前程序一直能跑,但今天使用了其中一个函数时却报错。后续查错,发现是自己忘记写结束符号了。 这就引出我知识点的不足了——之前为啥能跑正常?错误一只存在,为啥总是能编译通过?类中的函数何时才被实例化?类何时实例化?实例化的类是不是所有的函数都同时被实例化? 整理和理解网上资料后获得如下总结: 1. 在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化。   1.1声明一个类模板的指针和引用,不会引起类模板的实例化,因为没有必要知道该类的定义 。   1.2 定义一个类类型的对象时需要该类的定义,因此类模板会被实例化 。   1.3 在使用sizeof()时,它是计算对象的大小,编译器必须根据类型将其实例化出来,所以类模板被实例化 .   1.4 new表达式要求类模板被实例化。   1.5 引用类模板的成员会导致类模板被编译器实例化。   1.6 需要注意的是,类模板的成员函数本身也是一个模板。标准C++要求这样的成员函数只有在被调用或者取地址的时候,才被实例化。 用来实例化成员函数的类型,就是其成员函数要调用的那个类对象的类型 总结1很好的解释了为啥我的程序在调用特定的成员函数时才会报错。 不过上面的介绍还是比较笼统,还有很多的细节点需要注意到,从网上转载如下:转载链接

C++ 模板与泛型编程

跟風遠走 提交于 2020-02-06 05:27:24
《C++ Primer 4th》读书笔记 所谓泛型编程就是以独立于任何特定类型的方式编写代码。泛型编程与面向对象编程一样,都依赖于某种形式的多态性。 面向对象编程中的多态性在运行时应用于存在继承关系的类。我们能够编写使用这些类的代码,忽略基类与派生类之间类型上的差异。 在泛型编程中,我们所编写的类和函数能够多态地用于跨越编译时不相关的类型。一个类或一个函数可以用来操纵多种类型的对象。 面向对象编程所依赖的多态性称为运行时多态性,泛型编程所依赖的多态性称为编译时多态性或参数式多态性。 模板是泛型编程的基础。模板是创建类或函数的蓝图或公式。 函数模板 模板定义以关键字 template 开始,后接模板形参表,模板形参表是用尖括号括住的一个或多个模板形参的列表,形参之间以逗号分隔。模板形参表不能为空。 template <typename T> int compare(const T &v1, const T &v2) { if (v1 < v2) return -1; if (v2 < v1) return 1; return 0; } 模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参。类型形参跟在关键字 class 或 typename 之后定义.在函数模板形参表中,关键字 typename 和 class 具有相同含义,可以互换使用