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

【C++】泛型编程 ⑨ ( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 )

<< value << std::endl; } 每个函数前面都要加上 template 类型参数列表声明 , 使用域作用符 Father:: 访问函数 ; 3、函数声明与函数实现分离...+ 友元函数引入 如果要在 类模板 中进行运算符重载 , 就需要用到友元函数 ; 如果将 类模板 的 函数实现 , 定义在函数外部 , 结合 友元函数 使用 , 就变得很复杂 , 下面针对该问题进行讨论...三、类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 1、类模板 的 外部友元函数问题 将上述 " 普通类的运算符重载 - 函数声明 和 函数实现 写在同一个类中 " 示例改造成 类模板...示例 ; 问题就出现在 定义在外部的 友元函数 中 , 友元函数 , 不能 读取 和 访问 到 泛型类型 T , 也就是 类模板 中 的 template 泛型类型 T ; 在外部重新定义...template 就是重新定义了一个新的泛型 , 与 类模板 中的 T 不是同一个泛型类型 ; 解决上述问题 , 就需要将 友元函数 定义在 类模板 的内部 ; template

27110

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

: int , char , 自定义类 ; 数组 类模板 中 , 需要开发的要素如下 : 构造函数 , 初始化 数组数据 ; 拷贝构造函数 , 根据一个现有的 数组类模板对象 , 创建一个新的 实例对象...析构函数 : 在 类模板 外部 访问 类模板 中声明的 函数 , 先显示声明 模板类型 template , 然后在下面使用 域作用符 访问 类模板中的 函数 , 域作用符...前面的 类型 , 需要 注明实际类型 , 这里使用 Array:: 访问类模板 中的 函数 ; 注意 : 如果在 函数参数 和 函数返回值 中 , 使用到了 Array 类型 , 那么也必须加上..., 类模板内部定义的 操作符重载函数 , 其 左操作数 必须是 类本身 ; 外部友元函数 的 声明 : 声明时 , 需要在 函数名 和 参数列表之间 注明 泛型类型 ; 实现时 , 不能在 函数名...Array& a); } 外部友元函数 的 实现 : 在外部 实现 类模板的 友元函数 , 首先 , 还是注明 模板类型 , template ; 然后 , 在 函数参数 /

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

    【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 )

    ( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 ) 实现了第一种情况 , 类模板 的 函数声明 与 函数实现 都写在同一个类中 , 也就是没有分开进行编码...: 后面跟上要访问的成员 ; 最后 , 返回值和参数类型 , 如果是 类模板类型 Student , 需要在后面使用尖括号 指明具体的类型 , 这里具体的类型就是泛型 T ; 函数内部 Student...外部 实现 友元函数 友元函数 不是 类中的函数 , 是 类外部的函数 , 友元函数 中又用到了 泛型 T , 说明这是一个 模板函数 ; 友元函数 是 全局函数 , 不属于 类模板 , 不要使用 域操作符...访问友元函数 ; 友元函数 中的 泛型类型 , 要当做 函数模板 对待 ; 模板函数就涉及到 二次编译 问题 , 下面先分析一下 模板函数 二次编译 导致的 类模板的友元函数 问题 ; 友元函数 不要乱用..., 只有在 重载 左移 右移 操作符时 , 才使用 友元函数 ; ( 1 ) 错误示例及分析 - 类模板 的 外部友元函数 二次编译 问题 在 类模板 内部声明 友元函数 , template <typename

    23410

    C++面向对象程序设计(谭浩强)第三章第10~11节学习笔记

    ---- 3.10 友元 3.10.1友元函数 如果在本类以外的其他地方定义了一个函数(这个函数可以说是不属于任何类的非成员函数,也可以是其他类的成员函数),在类体中用friend对其进行声明,此函数就称为本类的友元函数...一个函数可以被多个类声明为“朋友”,这样就可以引用多个类中的私有数据。 3.10.2 友元类 可以将一个类B声明为另一个类A的“朋友”,此时B就是A的友元类。...关于友元利弊分析:面向对象程序设计的一个基本原则是封装性和信息隐蔽,而友元却可以访问其他类中的私有成员,不能不说这是对封装原则的一个小的破坏。...类模板是类的抽象,类是类模板的实例。...(函数形参表){…}  说明: (1)类模板的类型参数可以有一个或多个,毎个类型前面都必须加 class   template   class someclass

    20920

    C++初阶

    _day; return _cin; } int main() { Date d; cin >> d; cout << d << endl; return 0; } 说明: 友元函数可访问类的私有和保护成员...,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同 友元类 友元类的所有成员函数都可以是另一个类的友元函数...友元关系不能继承 一个类的友元函数能够访问类的( ) A.私有成员 B.保护成员 C.公有成员 D.所有成员 A.可以访问,这也把一个函数声明为友元的目的 B.可以访问 C.可以访问 D.友元函数对一个类里面的所有成员...,全部通吃,正确 A.友元函数不是类的成员函数,就相当于你的朋友再亲密也不是你的家人,既然不是类成员函数,那和普通成员函数调用一样,不需要通过对象调用 B.友元的目的就是为了访问类的私有数据,成员函数可以直接访问类的私有数据...函数模板的实例化 用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。 1.

    10210

    C++初阶大全

    _day; return _cin; } int main() { Date d; cin >> d; cout << d << endl; return 0; } 说明: 友元函数可访问类的私有和保护成员...,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同 友元类 友元类的所有成员函数都可以是另一个类的友元函数...友元关系不能继承 一个类的友元函数能够访问类的( ) A.私有成员 B.保护成员 C.公有成员 D.所有成员 A.可以访问,这也把一个函数声明为友元的目的 B.可以访问 C.可以访问 D.友元函数对一个类里面的所有成员...,全部通吃,正确 A.友元函数不是类的成员函数,就相当于你的朋友再亲密也不是你的家人,既然不是类成员函数,那和普通成员函数调用一样,不需要通过对象调用 B.友元的目的就是为了访问类的私有数据,成员函数可以直接访问类的私有数据...函数模板的实例化 用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。 1.

    5810

    【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

    友元分为:友元函数和友元类 通俗而言:友元函数的声明表达了友元函数能够访问这个类的权限,相当于客人(友元)函数拥有主人家的钥匙(友元声明),可以随便进出主人家里,偷吃主人家里的饼干(访问私有域成员...但是一个屋子有太多钥匙不太安全,故不要多给钥匙(友元不宜多用) 一.友元函数 友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend...关键字 说明: 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数...友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。...注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中 的所有成员。但是外部类不是内部类的友元。

    25110

    深入理解面向对象编程特性 : 继承

    编译器解析所有与模板参数无关的非依赖名称。 第二次名称查找:在模板实例化时进行。编译器解析依赖于模板参数的名称,即依赖名称。 依赖名称(Dependent Names)是指那些依赖于模板参数的名称。...但是由于foo()是依赖于模板参数T的成员函数,编译器无法确定foo()是从基类继承的。这是因为模板是按需实例化的,编译器在第一次查找时并不知道派生类实例化时会包含哪些基类成员。...法 /*Base() {}*/ } 继承:友元&静态成员 继承与友元 友元关系不继承: 在C++中,友元关系是特定于某个类的。...一个函数或类如果是父类的友元,它不会自动成为子类的友元。因此,父类的友元函数不能访问子类的私有成员和保护成员。同样地,如果你希望某个函数既是父类的友元,又是子类的友元,也可以在子类中声明该友元函数。...原因是友元关系不继承:Display函数虽然是Person的友元,但它不是Student的友元,所以不能访问Student的保护成员。

    15510

    八、特殊成员

    通过在类内部声明该函数为友元,可以使得该函数能够访问类的所有私有成员和保护成员。友元函数的声明在类的访问说明符(public、protected、private)之后,并且在任何成员函数声明之前。...; // 访问私有成员x } 友元类 友元类则是另一个类,它的所有成员函数都可以访问当前类的私有成员和保护成员。...因此,应当谨慎使用友元。 非成员函数:友元函数不是类的成员函数,它们不能通过对象来调用(尽管通常通过对象作为参数来传递信息)。 单向性:友元关系不是相互的。...即,如果类A是类B的友元,并不意味着类B也是类A的友元。 数量限制:一个类可以有多个友元函数或友元类,但通常建议限制友元的数量,以保持类的封装性。...访问权限:友元函数或友元类可以访问其友元类的所有私有成员和保护成员,但不能访问其友元类的公有成员(因为公有成员默认就是可访问的)。

    5210

    第 16 章 模板与泛型编程

    ,处于类的作用域之内 BlobPtr ret = *this; ... } 如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例;如果友元自身是模板,类可以授权给所有友元模板实例...用相同模板实参实例化的友元是该类的友元,可以访问非 public部分,而对于用其他实参实例化的实例则没有特殊访问权限。...为了让所有实例成为友元,友元声明中必须使用与类模板本身不同的模板参数。...Pal; // 用类 C实例化的 Pal是 C的一个友元 // Pal2的所有实例都是 C的友元,这种情况无须前置声明 template friend...class Pal2; // Pal3是一个非模板类,它是 C2所有实例的友元 friend class Pal3; // 不需要 Pal3的前置声明 }; 为方便使用,可以为类模板定义类型别名

    1.4K60

    第 16 章 模板与泛型编程

    ,处于类的作用域之内 BlobPtr ret = *this; ... } 如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例;如果友元自身是模板,类可以授权给所有友元模板实例...用相同模板实参实例化的友元是该类的友元,可以访问非 public部分,而对于用其他实参实例化的实例则没有特殊访问权限。...为了让所有实例成为友元,友元声明中必须使用与类模板本身不同的模板参数。...Pal; // 用类 C实例化的 Pal是 C的一个友元 // Pal2的所有实例都是 C的友元,这种情况无须前置声明 template friend...class Pal2; // Pal3是一个非模板类,它是 C2所有实例的友元 friend class Pal3; // 不需要 Pal3的前置声明 }; 为方便使用,可以为类模板定义类型别名

    1.5K20

    C++ 继承:代码传承的魔法棒,开启奇幻编程之旅

    继承基类的成员,访问方式都被限制为protected;通过private继承基类的成员,访问方式都被限制为了private。...基类的友元关系无法被继承,基类的友元无法访问派生类中收到保护的和私有的成员。...,只需要将fun函数也作为派生类的友元函数即可 六.继承与静态成员 在基类中定义了一个静态成员,则整个继承体系中都使用同一个静态成员,无论派生出多少个类。...降低了修改模块影响的范围 提高代码的复用性 模块独立性强,不依赖别的模块可完成测试 内聚 内聚指一个模块只关注它特定的职责和任务,实现一个打印数组的函数,那我们不会在打印函数中再实现一个将数组排为有序的功能...降低了修改模块影响的范围 提高代码的复用性 模块独立性强,不依赖别的模块可完成测试 内聚 内聚指一个模块只关注它特定的职责和任务,实现一个打印数组的函数,那我们不会在打印函数中再实现一个将数组排为有序的功能

    10510

    【笔记】《C++Primer》—— 第三部分:类设计者的工具

    定义方法是在声明函数名的时候函数体类似显式默认构造的写法改写为=0,只能对虚函数使用这个写法 友元只对被声明的类有效,友元的基类或派生类都不是友元 某个类对其继承来的成员的访问权限受到两个因素的影响:...类模板不会推断参数的类型 类模板的成员函数只有在使用时才会实例化 类模板与另一个模板直接最常见的友元是一对一的友元,首先模板需要声明所有需要用到的名字,然后在声明友元时标注出目标类的具体模板实参 类模板也可以一对多友元...,方法是直接将目标模板的名字标为友元,这样就与目标模板的所有实例都成为了友元。...要注意如果声明了目标友元的模板实参标识符,这些标识符需要与自身类模板的标识符不同 我们不能用typedef来起模板的类型别名,但是C11让我们可以用using来起模板的类型别名 C11允许我们为函数模板和类模板提供默认参数...,做法和默认函数实参类似但是写在模板参数列表里,也只能出现在最右侧 当需要在类外部定义类成员模板时,要注意此时需要两个template连用来说明标识符 extern显式实例化会实例化模板的所有成员,包括内联的成员函数

    1.7K10

    C++复习笔记——C++ 关键字

    export 为了访问其他编译单元(如另一代码文件)中的变量或对象,对普通类型(包括基本数据类、结构和类),可以利用关键字 extern,来使用这些变量或对象时;但是对模板类型,则必须在定义这些模板类对象和模板函数时...protected protected(受保护的),C++ 中的访问控制符。被标明为 protected的字段只能在本类以及其继承类和友元中访问。...友元可以访问与其有 friend关系的类中的 private/protected 成员,通过友元直接访问类中的 private/protected成员的主要目的是提高效率。友元包括友元函数和友元类。...静态变量或静态函数,只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。因此也称为"文件作用域"。...在 C++ 类的成员变量被声明为static(称为静态成员变量),意味着它被该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员

    1.3K30

    泛型编程的第一步,掌握模板的特性!

    — — || 05 函数模板和函数的次序 在有多个函数和函数模板名字相同的情况下,编译器如下规则处理一条函数调用语句: 先找参数完全匹配的普通函数(非由模板实例化而得的函数); 再找参数完全匹配的模板函数...— — || 03 函数模板作为类模板成员 当函数模板作为类模板的成员函数时,是可以单独写成函数模板的形式,成员函数模板在使用的时候,编译器才会把函数模板根据传入的函数参数进行实例化,例子如下: //...---- — 5 — 类模板与友元 || 01 函数、类、类的成员函数作为类模板的友元 代码例子如下: // 普通函数 void Func1() { } // 普通类 class A { };...friend void Func1(); // 友元函数 friend class A; // 友元类 friend void B::Func(); // 友元类的成员函数...}; // 任何从 Tmp 实例化来的类 ,都有以上三个友元 任何从 Tmp 实例化来的类 ,都有以上三个友元。

    51610

    C++ 类和对象

    对A按照模板分配的空间 A.number(); } 对象大小 首先 类成员 和 类成员函数 是分配在分别的空间的,可以认为在访问对象的成员是去独立分配的空间中找,但是类成员函数存在公共代码区...友元提供了一种突破类访问限定符封装的方法,分为友元函数和友元类,在函数声明或者类声明前加friend就是对friend开放权限。...外部友元函数可以访问类的私有和保护成员 友元函数可以在类定义的任何地方声明 一个函数可以是很多个函数的友元函数 友元函数的成员函数都可以说另一个类的友元函数..._A = 0;//类友元访问 } }; class A { friend void B(A& a);//友元函数 friend class C;//类友元 private: int _A; };..._A = 0;//友元函数访问 } 内部类 一个类被定义在另一个类内部,就是内部类,是一个独立的类,和定义在全局相比,只是收到了外部类类域的限制,外部类定义的对象中不包含内部类。

    8410

    C++:20---类模板(template)

    :类模板中的友元 一个类模板中也可以拥有友元(友元类/友元函数) 下面只有当与Blob类型相同的BlobPtr类和operator==函数才可以成为Blob模板类的友元 template 模板类的友元friend bool operator==(const Blob&, const Blob&);//使operator函数成为Blob模板类的友元}; template... class BlobPtr{}; 四、友元:通用和特定的模板友元关系 模板有需要复杂的关系,下面列出两个实例 template class Pal;...X> friend class Pal2;//任何类型实例化的Pal2对象都是C2的友元,因为模板参数列表不同 friend class Pal3;//Pal3是一个非模板类,它是所有类型C2实例化的友元...实例化成员模板:为了实例化一个类模板的成员模板,我们必须同时提供类和函数模板的实参。

    1.3K20

    【c++】类和对象(七)

    **因此,它不能访问类的非静态成员变量或成员函数,因为这些成员需要一个特定的对象实例来确定它们的上下文 无需对象实例:可以在没有类的对象实例的情况下调用静态成员函数。...、private 访问限定符的限制 2.友元 友元(Friend)在C++中是一个重要的概念,它允许某些特定的外部函数或类访问另一个类的私有(private)或受保护(protected)成员 2.1...: _year(year) , _month(month) , _day(day) {} private: int _year; int _month; int _day; }; 特点: 友元函数可访问类的私有和保护成员...,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同 2.3友元类 友元类的所有成员函数都可以是另一个类的友元函数...外部类对内部类没有任何优越的访问权限 内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。

    8920

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

    友元:将非公有成员的访问权授予指定的类或函数。friend在类定义内部。友元引入的类名和函数(定义或声明)可以像预先声明的一样使用。...重载操作符如果是成员函数,左操作数必须是该类的对象【一定是this】。 用函数或类操作某个类的数据可设置其为友元。== 的逻辑定义如果不一致,不定义类继承基类的访问控制标号【何种方式继承】无论是什么,不影响派生类使用基类成员,但影响使用派生类的用户访问基类成员。类使用接口继承还是实现继承对派生类用户具有重要含义。 友元关系不继承。...非类型形参的模板实参:template 实例化时必须是常量表达式 Screen 模板中的友元表示任何实例可以访问任何实例。模板类中可以有模板类成员。...模板类中的static成员由同一实例化的对象共享,但不同模板形参的实例化对象间不共享。

    1.4K20

    C++primer学习笔记(六)

    派生类继承基类的访问控制标号【何种方式继承】无论是什么,不影响派生类使用基类成员,但影响使用派生类的用户访问基类成员。类使用接口继承还是实现继承对派生类用户具有重要含义。 友元关系不继承。...派生类指针可自动转换到基类指针,反之不行。...泛型代码两个原则:1.模板形参是const引用 2.函数体中只用<比较 模板形参数量自由,可以设定返回值为一个形参。...非类型形参的模板实参:template 实例化时必须是常量表达式 Screen 模板中的友元表示任何实例可以访问任何实例。模板类中可以有模板类成员。...模板特化:template 模板名模板形参>函数形参表 函数体 特化类 也可以只特化类中某个成员 部分特化:多个模板形参,特化某个形参【编译器会优先选择特化的】。

    1.1K20
    领券