首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】泛型编程 ⑬ ( 类模板示例 - 数组类模板 | 构造函数和析构函数 的 声明与实现 | 普通成员函数 的 声明与实现 | 外部友元函数 的 声明与实现 )

一、类模板示例 - 数组类模板 1、需求分析 类模板 的 作用就是 令 算法 和 数据类型分离 ; 本篇博客中 开始 使用 类模板 开发一个 数组类 , 数组 中 可以维护 不同类型的 元素数据 , 如...: int , char , 自定义类 ; 数组 类模板 中 , 需要开发的要素如下 : 构造函数 , 初始化 数组数据 ; 拷贝构造函数 , 根据一个现有的 数组类模板对象 , 创建一个新的 实例对象...cout << " 调用析构函数 " << endl; } 3、普通成员函数 的 声明与实现 重载 数组下标 [] 操作符 , 使用 类模板内部 的 成员函数即可完成 ; 普通成员函数 的 声明 : 数组下标...Array { public: // 数组下标 [] 操作符重载 // 数组元素类型是 T 类型 T& operator[](int i); } 普通成员函数 的 实现 : 类模板 外部 实现...cout 是 ostream 引用类型的 , 右操作数是 数组本身类型引用 , 返回值是 ostream 引用类型 以便可以进行链式调用 ; 因此 , 该 左移 类模板 内部定义

52110

《C++Primer》第十六章 模板与泛型编程

因此我们通常将类定义和函数声明放在头文件中,而普通函数和类的成员函数的定义放在源文件中。 为了生成一个实例化版本,编译器需要掌握函数模板或者类模板成员函数的定义。...模板声明时,他不会在本文件中生成实例化代码,将一个实例化声明为extern就表示承诺在程序其他位置有该实例化的一个非extern声明(定义)。...// 实例化类模板的所有成员 当编译器遇到一个实例化定义(与声明相对)时,它为其生成代码。...一个类模板的实例化定义会实例化该模板的所有成员,包括内联的成员函数。与处理类模板的普通实例化不同,编译器会实例化该类的所有成员。即使我们不使用某个成员,它也会被实例化。...特例化成员而不是类 假定Foo是一个模板类,包含一个成员Bar,我们可以只特例化该成员: template struct Foo { Foo(const T &t =

1.9K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++模板总结

    模板是 C++ 支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。...模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板: 函数模板 针对仅参数类型不同的函数; 类模板 针对仅数据成员和成员函数类型不同的类....: 在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化: 1、声明一个类模板的指针和引用,不会引起类模板的实例化,因为没有必要知道该类的定义...5、引用类模板的成员会导致类模板被编译器实例化 6、需要注意的是,类模板的成员函数本身也是一个模板。标准 C++ 要求这样的成员函数只有在被调用或者取地址的时候,才被实例化。...用来实例化成员函数的类型,就是其成员函数要调用的那个类对象的类型。

    1.3K20

    C++模板大总结!

    模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。...模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板: 函数模板 针对仅参数类型不同的函数; 类模板 针对仅数据成员和成员函数类型不同的类....,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。...: 在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化: 1、声明一个类模板的指针和引用,不会引起类模板的实例化,因为没有必要知道该类的定义...5、引用类模板的成员会导致类模板被编译器实例化 6、需要注意的是,类模板的成员函数本身也是一个模板。标准C++要求这样的成员函数只有在被调用或者取地址的时候,才被实例化。

    74820

    【笔记】《深入理解C++11》(上)

    初始化列表的效果总是慢于就地初始化, 但也快过在构造函数中进行赋值 注意: 非常量的静态变量依然要在头文件外定义从而保证在程序中只存在一个 sizeof()可以对类成员表达式使用了 类模板也可以声明友元了...有了extern后编译器会自动删除重复的实例化模板, 不但节省内存还节省了多余的实例化时间 注意被其他文件调用的外部模板一定要在要用到的类实例化之前实例化 局部和匿名成员可以作为模板实参了, 但仍要注意匿名类型的声明不能在参数位置...在C++11的标准中提出SFINEA的动机是当年C++98中并没有对这个规则进行标准化的描述, 因此各个编译器对于函数模板的匹配规则都是混乱的, 因此新标准提出SFINEA来使程序员能按照自己的想象来理解编译器并令其能精确匹配我们所需要的函数..., 需要泛型的时候还是应该用模板处理 auto禁止对结构体中的非静态成员进行推导 不允许声明auto数组 新增的range-for语法要求目标有begin和end函数, 且支持++和==, 常与auto..., 字面量等编译器标记后的其他程序员自定义的标记)或者类成员访问表达式, 那么返回目标的类型.

    2K20

    面试总结-C++

    起到了隐藏的作用 在类的 static 成员变量属于整个类所拥有,对类的所以对象只有一份拷贝 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static...指针可以先声明,但是引用声明的时候就必须初始化,不存在空的引用很容易理解。 指针变量可以改变所指的对象。但是引用一旦声明了就不能再改变引用的对象了。...引用相关问题 引用是某个变量的别名,因此定义的时候必须初始化,也不能把该引用再改成其他变量的别名。 声明一个引用并没有定义新变量,引用本身不是一种数据类型。也不占用存储空间。...当类中存在const或者引用时成员变量时,必须使用初始化表。...因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。

    2.1K11

    读完某C++神作,我只记下了100句话

    定义在函数体外的内置变量自动初始化成0,定义在函数体内的内置变量不进行自动初始化,类类型(string)调用默认构造函数初始化。...const的对象,指针引用只能调用常量成员函数。 没有前缀的成员都被假定为this在调用。 默认构造函数按变量初始化规则初始化类中所有成员【内置类型作为局部变量时不初始化】。...mutable用来声明数据成员可以修改【突破各种const的限制】。 使用类外全局作用域的变量可以::var来获得。 类中的const成员必须在初始化列表中初始化,无法再构造函数体内赋值。...非引用形参将复制实参值,非引用return将复制return的东西。即使定义了其他构造函数,也会合成复制构造函数【能够复制类中的数组】。类成员有指针一般需要显示定义复制构造函数。...模板类中的static成员由同一实例化的对象共享,但不同模板形参的实例化对象间不共享。

    1.4K20

    《逆袭进大厂》之C++篇49问49答

    13、哪几种情况必须用到初始化成员列表? 初始化一个const成员。 初始化一个reference成员。 调用一个基类的构造函数,而该函数有一组参数。...当数组名当做形参传递给调用函数后,就失去了原有特性,退化成一般指针,多了自增、自减操作,但sizeof运算符不能再得到原数组的大小了。...,并且必须有构造函数;不同类对其const数据成员的值可以不同,所以不能在类中声明时初始化 const成员函数:const对象不可以调用非const成员函数;非const对象都可以调用;不可以改变非mutable...注意 模板及其特例化版本应该声明在同一个头文件中,且所有同名模板的声明应该放在前面,后面放特例化版本。...派生类对基类成员的访问形象有如下两种: 内部访问:由派生类中新增的成员函数对从基类继承来的成员的访问 外部访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问 (二)继承权限 public继承

    2K10

    《逆袭进大厂》之C++篇49问49答(绝对的干货)

    13、哪几种情况必须用到初始化成员列表? 初始化一个const成员。 初始化一个reference成员。 调用一个基类的构造函数,而该函数有一组参数。...当数组名当做形参传递给调用函数后,就失去了原有特性,退化成一般指针,多了自增、自减操作,但sizeof运算符不能再得到原数组的大小了。...(const int& i){ //... } 考虑类的情况 const成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其const数据成员的值可以不同...注意 模板及其特例化版本应该声明在同一个头文件中,且所有同名模板的声明应该放在前面,后面放特例化版本。...派生类对基类成员的访问形象有如下两种: 内部访问:由派生类中新增的成员函数对从基类继承来的成员的访问 外部访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问 (二)继承权限 public继承

    2.6K40

    C++11特性大杂烩

    基于此,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率。...因为这个迭代器类型由一个类模板来定义,在该类模板未被实例化之前编译器是无法识别这个类型最好也增加一个用initializer_list为参数的赋值运算符重载函数,来支持对列表对象进行赋值。...,类模板和参数模板只能含固定数量的模板参数,可变参数模板可以含0-N个模板参数// Args是一个模板参数包,args是一个函数形参参数包// 声明一个参数包Args...args,这个参数包中可以包含...;模板处需要传递类的名称(传递this指针);调用处需要传递类的匿名对象。下面是对function包装器的使用。可以看到这里有一个useF模板函数,参数是两个模板参数。...然后是对类中静态成员count进行++和取地址,最后返回第一个模板参数f的调用,传的参数是第二个模板参数x。

    90950

    C++:19---重载与模板、模板特例化

    ,而有多个函数模板,则其中一个模板比其他模板更特例化,则选择此模板 否则,调用有歧义 ①对于一个调用,其候选函数包括所有模板实参推断成功的函数模板实例 ②候选的函数模板总是可行的,因为模板实参推断会排除任何不可行的模板...在本例中声明接受的string参数的debug_rep版本,编译器会默认地实例化接受const T&的模板版本 二、模板实例化 编写单一模板,使之对任何可能的模板实参都是最适合的,都能实例化,这并不总是能办到...) 类模板特例化 除了特例化函数模板,我们还可以特例化类模板 作为了一个例子: 一个重载的调用运算符,它接受一个容器关键字类型的对象,返回一个size_t 两个类型成员,result_type和argument_type...(T&&)部分特例化版本remove_reference::type c;//a、b、c均为int 特例化成员而不是类 我们可以之特例化特定成员函数而不是特例化整个模板...例如,如果Foo是一个模板,包含一个成员Bar,我们可以只特例化该成员: //下面是一个模板类templatestruct Foo {Foo(const T &t = T())

    1.5K20

    第 16 章 模板与泛型编程

    一个类模板的每个实例都形成一个独立的类,类型 Blob与任何其他 Blob类型都没有关联,也不会对任何其他 Blob类型的成员有特殊访问权限。...一对一友好关系。用相同模板实参实例化的友元是该类的友元,可以访问非 public部分,而对于用其他实参实例化的实例则没有特殊访问权限。...>; 与类模板的普通实例化不同,类模板的显式实例化定义会实例化该模板的所有成员。...数组或函数指针转换:如果函数形参不是引用类型,则可以对数组或函数类型的实参应用正常的指针转换。 其它类型转换,如算数转换、派生类向基类的转换以及用户定义的转换都不能应用于函数模板。...所有同名模板的声明应该放在前面,然后是这些模板的特例化版本。 类模板特例化。作为例子,这里为 Sales_data类定义特例化版本的 hash模板。

    1.4K60

    第 16 章 模板与泛型编程

    一个类模板的每个实例都形成一个独立的类,类型 Blob与任何其他 Blob类型都没有关联,也不会对任何其他 Blob类型的成员有特殊访问权限。...一对一友好关系。用相同模板实参实例化的友元是该类的友元,可以访问非 public部分,而对于用其他实参实例化的实例则没有特殊访问权限。...>; 与类模板的普通实例化不同,类模板的显式实例化定义会实例化该模板的所有成员。...数组或函数指针转换:如果函数形参不是引用类型,则可以对数组或函数类型的实参应用正常的指针转换。 其它类型转换,如算数转换、派生类向基类的转换以及用户定义的转换都不能应用于函数模板。...所有同名模板的声明应该放在前面,然后是这些模板的特例化版本。 类模板特例化。作为例子,这里为 Sales_data类定义特例化版本的 hash模板。

    1.5K20

    2W五千字的C++基础知识整理汇总

    该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务。 该文件为用户控制的文件处理声明服务。...指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。...类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。...这意味着它们只能被 Box 类中的其他成员访问,而不能被程序中其他部分访问。这是实现封装的一种方式。...为了使类中的成员变成公有的(即,程序中的其他部分也能访问),必须在这些成员前使用 public 关键字进行声明。所有定义在 public 标识符后边的变量或函数可以被程序中所有其他的函数访问。

    2.6K10

    整理了70道C语言与C++常见问答题

    定义」对单一模板提供的一个特殊实例,它将一个或多个模板参数绑定到特定的类型或值上 (1)模板函数特例化 必须为原函数模板的每个模板参数都提供实参,且使用关键字template后跟一个空尖括号对,表明将原模板的所有模板参数提供实参...「注意」模板及其特例化版本应该声明在同一个头文件中,且所有同名模板的声明应该放在前面,后面放特例化版本。...(2)类模板特例化 原理类似函数模板,不过在类中,我们可以对模板进行特例化,也可以对类进行部分特例化。...}; 「类模板的部分特例化」 不必为所有模板参数提供实参,可以指定一部分而非所有模板参数,一个类模板的部分特例化本身仍是一个模板,使用它时还必须为其特例化版本中未指定的模板参数提供实参(特例化时类名一定要和原来的模板相同...,只是参数类型不同,按最佳匹配原则,哪个最匹配,就用相应的模板) 「特例化类中的部分成员」 可以特例化类中的部分成员函数而不是整个类,举个例子: template class Foo

    3.1K01

    一文让你学完C++,干货收藏!!!

    该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务。 该文件为用户控制的文件处理声明服务。...指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。...类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。...这意味着它们只能被 Box 类中的其他成员访问,而不能被程序中其他部分访问。这是实现封装的一种方式。...为了使类中的成员变成公有的(即,程序中的其他部分也能访问),必须在这些成员前使用 public 关键字进行声明。所有定义在 public 标识符后边的变量或函数可以被程序中所有其他的函数访问。

    3.4K20

    C++模板(关键字template,typename)介绍

    模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。...模板是一种对类型进行参数化的工具; 通常有两种形式:函数模板和类模板; 函数模板针对仅参数类型不同的函数; 类模板针对仅数据成员和成员函数类型不同的类。...使用模板的目的就是能够让程序员编写与类型无关的代码。...一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名。...,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。

    1.2K20

    Google C++ 编程风格指南(五):其他 C++ 特性

    某些情况下, 相对于将类成员声明为 public, 使用友元是更好的选择, 尤其是如果你只允许另一个类访问该类的私有成员时. 当然, 大多数类都只应该通过其提供的公有成员进行互操作. 5.7....其他不会修改任何数据成员, 未调用非 const 函数, 不会返回数据成员非 const 指针或引用的函数也应该声明成 const....friend 实际上只对函数/类赋予了对其所在类的访问权限,并不是有效的声明语句。...本风格指南都强调了「友元应该定义在同一文件内,避免代码读者跑到其它文件查找使用该私有成员的类」。那么可以把其声明放在类声明所在的头文件,定义也放在类定义所在的文件。...由于友元函数/类并不是类的一部分,自然也不会是类可调用的公有接口,于是我主张全集中放在类的尾部,即的数据成员之后,参考 声明顺序 。 对使用 C++ 异常处理应具有怎样的态度? 非常值得一读。

    1.2K30

    一文让你学完C++,干货收藏!!!

    该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务。 该文件为用户控制的文件处理声明服务。...指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。...下面列出了 C++ 程序员必须清楚的两个与 C++ 引用相关的重要概念: 概念 描述 把引用作为参数 C++ 支持把引用作为参数传给函数,这比传一般的参数更安全。...类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。...为了使类中的成员变成公有的(即,程序中的其他部分也能访问),必须在这些成员前使用 public 关键字进行声明。所有定义在 public 标识符后边的变量或函数可以被程序中所有其他的函数访问。

    3K3029

    一文让你学完C++,干货收藏!!!

    该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务。 该文件为用户控制的文件处理声明服务。...指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。...下面列出了 C++ 程序员必须清楚的两个与 C++ 引用相关的重要概念: 概念 描述 把引用作为参数 C++ 支持把引用作为参数传给函数,这比传一般的参数更安全。...类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。...为了使类中的成员变成公有的(即,程序中的其他部分也能访问),必须在这些成员前使用 public 关键字进行声明。所有定义在 public 标识符后边的变量或函数可以被程序中所有其他的函数访问。

    2.3K20
    领券