精华内容
下载资源
问答
  • 1. 请创建一个数据类型T链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定链表构造当前链表(10分)...
  • 1. 请创建一个数据类型T链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List<T>& list),根据一个给定链表构造当前链表(10...
  • C++中template

    2016-05-19 01:07:48
    以下内容转自http://www.cnblogs.com/gaojun/archive/2010/09/10/1823354.html 1. 模板的概念。 我们已经学过重载...例如,求两个数最大值,我们定义MAX()函数需要对不同数据类型分别定义不同重载(Overl

    以下内容转自http://www.cnblogs.com/gaojun/archive/2010/09/10/1823354.html

    1. 模板的概念。

    我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。

    //函数1.

    int max(int x,int y);
    {return(x>y)?x:y ;}

    //函数2.
    float max( float x,float y){
    return (x>y)? x:y ;}

    //函数3.
    double max(double x,double y)
    {return (c>y)? x:y ;}

    但如果在主函数中,我们分别定义了 char a,b; 那么在执行max(a,b);时 程序就会出错,因为我们没有定义char类型的重载版本。

    现在,我们再重新审视上述的max()函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样就会避免因重载函数定义不 全面而带来的调用错误。为解决上述问题C++引入模板机制,模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

    2.   函数模板的写法

    函数模板的一般形式如下:

    Template <class或者也可以用typename T>

    返回类型 函数名(形参表)
    {//函数定义体 }

    说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.

    请看以下程序:

    //Test.cpp

    #include <iostream>

    using std::cout;

    using std::endl;

    //声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,

    //T可以被任何字母或者数字代替。

    template <class T>

    T min(T x,T y)

    return(x<y)?x:y;}

    void main( )

    {

         int n1=2,n2=10;

         double d1=1.5,d2=5.6;

         cout<< "较小整数:"<<min(n1,n2)<<endl;

         cout<< "较小实数:"<<min(d1,d2)<<endl;

         system("PAUSE");

    }


    展开全文
  • 如果该值false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion...
  • 我们知道堆上申请的空间必须通过手动释放来回收,如果忘记这一点,很容易造成内存泄漏。智能指针的引入就是为了解决如何在正确的时机(已经没有利用价值)释放... 智能指针类必须定义为类模板,这样才能hold住所有具体

    我们知道堆上申请的空间必须通过手动释放来回收,如果忘记这一点,很容易造成内存泄漏。智能指针的引入就是为了解决如何在正确的时机(已经没有利用价值)释放堆上申请的空间,其实现原理是通过在指针外面包一层类,并在栈上生成此类的对象,当它在栈上被自动回收的时候,将堆上的空间也释放掉。

    1. 重新造一个轮子

    自定义智能指针遵循以下两个原则:
    1). 智能指针类必须定义为类模板,这样才能hold住所有具体类
    2). 引用计数必须包含在具体类中,即只在最源头保存一个引用计数

    ReferenceCounted.h

    所有具体类必须继承自ReferenceCounted类。其内部包含引用计数,当被一个SmartPtr引用时就自增,当一个SmartPtr被回收时就自减。当引用计数减为0时,通过调用delete this显式地将自己回收。
    #ifndef REFERENCECOUNTED_H
    #define REFERENCECOUNTED_H
    
    class ReferenceCounted
    {
    public:
    	ReferenceCounted()
    	{
    		referenceCounter = 0;
    	}
    	void AddRef()
    	{
    		++referenceCounter;
    	}
    	void Release()
    	{
    		if (referenceCounter > 0 && --referenceCounter == 0)
    		{
    			delete this;
    		}
    	}
    protected:
    	// 虚析构函数!
    	virtual ~ReferenceCounted(){}
    private:
    	// 引用计数
    	int referenceCounter;
    };
    
    #endif

    SmartPtr.h

    SmartPtr类被定义为类模板,可以接收任何继承自ReferenceCounted类的具体类。
    #ifndef SMARTPTR_H
    #define SMARTPTR_H
    
    // ReferenceCountedT必须是一个继承自ReferenceCounted的类
    template <class ReferenceCountedT>
    class SmartPtr
    {
    public:
    	// 构造函数一:传入类型为ReferenceCountedT的指针来构造SmartPtr,必须保证p所指向的内容在堆上
    	SmartPtr(ReferenceCountedT *p);
    	// 构造函数二:拷贝构造函数,用一个SmartPtr来构造另一个SmartPtr
    	SmartPtr(const SmartPtr<ReferenceCountedT> &p);
    	~SmartPtr();
    	// 重载赋值运算符一:必须保证p所指向的内容在堆上
    	SmartPtr& operator =(const ReferenceCountedT *p);
    	// 重载赋值运算符二:智能指针间赋值
    	SmartPtr& operator =(const SmartPtr<ReferenceCountedT> &p);
    	// 重载取值运算符
    	ReferenceCountedT& operator *() const;
    	// 重载成员选择运算符
    	ReferenceCountedT* operator ->() const;
    	// 重置SmartPtr的内部指针
    	void Reset(ReferenceCountedT *p = NULL);
    	// 获得内部指针
    	ReferenceCountedT* Get();
    private:
    	void Dispose();
    	ReferenceCountedT *ptr;
    };
    
    // 用法
    // ReferenceCounted *p = new ReferenceCounted();
    // SmartPtr<ReferenceCounted> sp(p);
    template <class ReferenceCountedT>
    SmartPtr<ReferenceCountedT>::SmartPtr(ReferenceCountedT *p)
    {
    	ptr = p;
    	if (ptr)
    	{
    		ptr->AddRef();
    	}
    }
    
    // 用法
    // ReferenceCounted *p = new ReferenceCounted();
    // SmartPtr<ReferenceCounted> sp1(p);
    // SmartPtr<ReferenceCounted> sp2(sp1);
    template <class ReferenceCountedT>
    SmartPtr<ReferenceCountedT>::SmartPtr(const SmartPtr<ReferenceCountedT> &p)
    {
    	ptr = p.ptr;
    	if (ptr)
    	{
    		ptr->AddRef();
    	}
    }
    
    template <class ReferenceCountedT>
    SmartPtr<ReferenceCountedT>::~SmartPtr()
    {
    	Dispose();
    }
    
    template <class ReferenceCountedT>
    SmartPtr<ReferenceCountedT>& SmartPtr<ReferenceCountedT>::operator =(const ReferenceCountedT *p)
    {
    	Reset(p);
    	return *this;
    }
    
    template <class ReferenceCountedT>
    SmartPtr<ReferenceCountedT>& SmartPtr<ReferenceCountedT>::operator =(const SmartPtr<ReferenceCountedT> &p)
    {
    	Reset(p.ptr);
    	return *this;
    }
    
    template <class ReferenceCountedT>
    ReferenceCountedT& SmartPtr<ReferenceCountedT>::operator *() const
    {
    	return *ptr;
    }
    
    template <class ReferenceCountedT>
    ReferenceCountedT* SmartPtr<ReferenceCountedT>::operator ->() const
    {
    	return ptr;
    }
    
    template <class ReferenceCountedT>
    void SmartPtr<ReferenceCountedT>::Reset(ReferenceCountedT *p)
    {
    	// 避免自赋值self-assignment
    	if (ptr != p)
    	{
    		Dispose();
    		ptr = p;
    		if (ptr)
    		{
    			ptr->AddRef();
    		}
    	}
    }
    
    template <class ReferenceCountedT>
    ReferenceCountedT* SmartPtr<ReferenceCountedT>::Get()
    {
    	return ptr;
    }
    
    template <class ReferenceCountedT>
    void SmartPtr<ReferenceCountedT>::Dispose()
    {
    	if (ptr)
    	{
    		ptr->Release();
    	}
    }
    
    #endif
    测试代码:

    MyClass.h

    MyClass类表示一个具体类,继承自ReferenceCounted。
    #include "ReferenceCounted.h"
    
    class MyClass : public ReferenceCounted
    {
    public:
    	MyClass()
    	{
    		num = 0;
    	}
    	int MyFoo()
    	{
    		++num;
    		return num;
    	}
    	int num;
    protected:
    	~MyClass(){}
    };

    Main.cpp

    #include "SmartPtr.h"
    #include "MyClass.h"
    #include <crtdbg.h>
    #include <vector>
    #include <iostream>
    using namespace std;
    
    void main(void)
    {
    	{
    		MyClass *rc1 = new MyClass();
    		SmartPtr<MyClass> sp1 = rc1; // 普通构造函数
    		SmartPtr<MyClass> sp2 = sp1; // 拷贝构造函数
    		SmartPtr<MyClass> sp3(rc1); // 普通构造函数
    		SmartPtr<MyClass> sp4(sp1); // 拷贝构造函数
    
    		MyClass *rc2 = new MyClass();
    		sp3 = rc2; // 赋值运算符
    		sp4 = sp3; // 赋值运算符
    
    		cout << (*sp1).MyFoo() << endl; // 像指针一样操作
    		cout << sp1->MyFoo() << endl;
    
    		vector<SmartPtr<MyClass>> v; // 在vector中的表现
    		v.push_back(sp1);
    		v.push_back(sp2);
    		v.push_back(sp3);
    		v.push_back(sp4);
    	}
    	_CrtDumpMemoryLeaks();
    }

    2. C++自带智能指针研究


    展开全文
  • 其中最上面的为菜单栏。 2.我们在Type Here 那里双击,并输入“文件(&F)”,这样便可将其文件菜单的 快捷键设为Alt+F。(注意括号最好用英文半角输入,这样看着美观) 3.输入完按下Enter 键确认即可,然后在子菜单中...
  • 员工摘要-源码

    2021-02-24 07:22:43
    构建构造函数给正确编写语法并形成对Node.JS编码环境更深刻理解带来了挑战。 当我尝试将构造函数传递到测试中时,模块导出无法正常工作,因为我将构造函数封装在{}中,由于只有一项,因此不需要使用该构造函数。...
  • 3.7.2 模式结构的正确命名 53 3.7.3 ER概念设计设计选择 54 3.7.4 ER图候选表示法 55 3.8 其他表示法示例:UML类图 55 3.9 高于2度联系类型 57 3.9.1 对二元和三元(或高度)联系选择 ...
  • 然后需要定义一个工厂,工厂可以根据条件生成不同子类实例。 当得到子类实例后,开发人员可以调用基类中方法而不必考虑到底返回是哪一个子类实例。 35、JSP四种会话跟踪技术 我答案: ...
  • 关于的序列化,下列说法哪些是正确的:D A .的序列化与serialVersionUID毫无关系。 B .如果完全不兼容升级,不需要修改serialVersionUID值。 C .POJO的serialVersionUID不一致会编译出错。 D .POJO...
  • XMLparser发展:一种是"非确认paeser",只检测文档是否遵守XML语法规则,是否用元素标识建立了文档树。另一种是"确认paeser",它不但检测文档语法,结构树,而且比较解析你使用元素标识是否遵守了相应...
  • flash shiti

    2014-03-14 10:32:41
    36.以下语句说法正确的有: A. getURL表示使浏览器浏览到指定页面 B. gotoAndPlay表示跳转到指定帧并播放 C. gotoAddStop表示跳转到指定帧并停止播放 D. loadMovie表示引入一个外部电影到指定层 37.比较运算符...
  • 高质量 C++/C 编程指南

    2017-03-30 00:11:58
    , 涵盖了C++程序设计每一个方面,包括设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、STL容器和算法等。书中对每一条规范都给出了言简意赅叙述,并辅以...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。 5、示例:下面有一段伪代码...
  • Visual C++ 2005 入门经典 详细书签版

    热门讨论 2013-02-02 16:39:43
    8.5.3 使用有多个形参的类模板 403 8.6 使用类 405 8.6.1 类接口概念 405 8.6.2 定义问题 405 8.6.3 实现CBox类 406 8.6.4 定义CBox类 413 8.6.5 使用CBox类 423 8.7 组织程序代码 426 8.8 C++/...
  • 8.5.3 使用有多个形参的类模板 403 8.6 使用类 405 8.6.1 类接口概念 405 8.6.2 定义问题 405 8.6.3 实现CBox类 406 8.6.4 定义CBox类 413 8.6.5 使用CBox类 423 8.7 组织程序代码 426 8.8 C++/...
  • 软件工程知识点

    2012-12-02 21:34:25
    系统确认验证需要以用户主体,以需求规格说明书中对软件的定义为依据,由此对软件各项规格进行逐项地确认,以确保已经完成软件系统与需求规格一致性。为了方便用户在系统确认期间能够积极参入,也为了系统在...
  • 软件测试规范

    2018-04-23 09:16:12
    1.等价划分 .......................................................................................................................................... 7 2.因果图 ........................................
  • 1、上传所有程序和模板文件,以下几个目录以及目录下所有文件权限需设置成 777 blockcache - 区块缓存目录,可在后台设置目录名称 cache - 网页缓存目录,可在后台设置目录名称 configs - 配置文件目录 ...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    超越今天各自超越今天各自 超越今天各自 Web 站点 站点站点 站点 把 把把 把 Internet 建成一 建成建成 建成 个 一个一 一个可 可个可 可 以互相交换组件地方 以互相...
  • java 面试题 总结

    2009-09-16 08:45:34
    如果该值false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    根据项目开发的不同阶段,用正确的观点来画类图 不要每个事物都画一个模型,应该把精力放在关键的领域 对象图 对象图 表示在某一时刻的具体实例和这些实例之间的具体连接关系 与 对象 关系 与 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    超越今天各自超越今天各自 超越今天各自 Web 站点 站点站点 站点 把 把把 把 Internet 建成一 建成建成 建成 个 一个一 一个可 可个可 可 以互相交换组件地方 以互相...
  •  点击商品之后,需要显示商品详细信息,通过商品id返回指定商品Bean对象,转化JSON格式数据,返回到前端页面显示,需要显示商品留言信息,因此需要留言Bean对象,包括数据留言id、留言商品id、留言...
  • Java访问权限控制源代码 1个目标文件 摘要:Java源码,文件操作,权限控制 Java访问权限控制,Java操作文件、写入文件分配合适权限,定义写到文件信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java访问权限控制,Java操作文件、写入文件分配合适权限,定义写到文件信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    面试题131 什么是类模板 143 12.2 容器 145 面试题132 什么是容器 145 面试题133 有哪几种顺序容器 147 面试题134 什么是迭代器范围 149 面试题135 什么是关联容器 150 12.3 泛型编程 152 面试题136 什么是泛型...
  • 数据结构(C++)有关练习题

    热门讨论 2008-01-02 11:27:18
    内容及步骤: 1、 设计一个图类,采用临接表法进行存储,该图每个结点数据类型类模板的模板参数进行定义(注:需先设计一个结点类Node); 2、 该类分别设计一个实现深度优先搜索和广度优先搜索成员...
  • 测试培训教材

    2014-04-01 12:10:48
    本测试集包含用于测试Mercury Tours网站功能正确测试用例。 设置测试集属性中详细信息: In ITG Request Id, add the IT Governance request ID. Note that this is relevant only when integrating ...

空空如也

空空如也

1 2 3
收藏数 51
精华内容 20
关键字:

以下类模板定义正确的为