【C++】泛型编程 ⑨ ( 类模板的运算符重载 | 您所在的位置:网站首页 › 函数重载与函数模板的说法 › 【C++】泛型编程 ⑨ ( 类模板的运算符重载 |
文章目录
一、类模板 - 函数声明与函数实现分离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 . . .将上述 " 普通类的运算符重载 - 函数声明 和 函数实现 写在同一个类中 " 示例改造成 类模板 示例 ; 问题就出现在 定义在外部的 友元函数 中 , 友元函数 , 不能 读取 和 访问 到 泛型类型 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 实验室设备网 版权所有 |