【C++】泛型编程 ⑨ ( 类模板的运算符重载 您所在的位置:网站首页 函数重载与函数模板的说法 【C++】泛型编程 ⑨ ( 类模板的运算符重载

【C++】泛型编程 ⑨ ( 类模板的运算符重载

2024-06-13 13:51| 来源: 网络整理| 查看: 265

文章目录 一、类模板 - 函数声明与函数实现分离1、函数声明与函数实现分离2、代码示例 - 函数声明与函数实现分离3、函数声明与函数实现分离 + 友元函数引入 二、普通类的运算符重载 - 函数声明 和 函数实现 写在同一个类中三、类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中1、类模板 的 外部友元函数问题2、代码示例 - 类模板 函数声明 和 函数实现 写在同一个类中 ( 包括友元函数 )

一、类模板 - 函数声明与函数实现分离 1、函数声明与函数实现分离

项目开发中 , 需要 将 函数声明 与 函数实现 分开进行编码 ;

将 函数声明 与 函数实现 分开进行编码 , 有 三种 方式 :

类模板 的 函数声明 与 函数实现 都写在同一个类中 ;类模板 的 函数实现 在 类外部进行 , 写在相同的 .h 和 .cpp 源码文件中 ;类模板 的 函数实现 在 类外部进行 , 写在不同的 .h 和 .cpp 源码文件中 ; 2、代码示例 - 函数声明与函数实现分离

对于下面的 Father 类中的 printValue 函数 ,

// 声明 类模板 父类 template class Father { public: T value; Father(T val) : value(val) {} void printValue() { std::cout } void printValue(); }; // 在 类模板 外部实现函数 template void Father::printValue() { std::cout this->a = x; this->b = y; } // 重载 + 运算符 Student operator+(Student& s) { Student student(this->a + s.a, this->b + s.b); return student; } // 打印类成员变量 void printStudent() { cout Student s(666, 888); s.printStudent(); // 控制台暂停 , 按任意键继续向后执行 system("pause"); return 0; }

执行结果 :

10 666 88 66 Press any key to continue . . .

在这里插入图片描述

三、类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 1、类模板 的 外部友元函数问题

将上述 " 普通类的运算符重载 - 函数声明 和 函数实现 写在同一个类中 " 示例改造成 类模板 示例 ;

问题就出现在 定义在外部的 友元函数 中 ,

友元函数 , 不能 读取 和 访问 到 泛型类型 T , 也就是 类模板 中 的 template 泛型类型 T ;

在外部重新定义 template 就是重新定义了一个新的泛型 , 与 类模板 中的 T 不是同一个泛型类型 ;

在这里插入图片描述

解决上述问题 , 就需要将 友元函数 定义在 类模板 的内部 ;

template class Student { // 左移运算符重载 friend ostream& operator // 左移运算符重载 friend ostream& operator this->a = x; this->b = y; } // 重载 + 运算符 Student operator+(Student& s) { Student student(this->a + s.a, this->b + s.b); return student; } // 打印类成员变量 void printStudent() { cout // 模板类不能直接定义变量 // 需要将 模板类 具体化之后才能定义变量 Student s(666, 888); s.printStudent(); Student s2(222, 111); s2.printStudent(); // 验证 加法运算符 + 重载 Student s3 = s + s2; s3.printStudent(); // 验证 左移运算符


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有