类模板是创建类的模式

  1. 类模板和函数模板一样,使用关键字template引入一个类模板。类模板是创建类的模式,通过提供模板参数来实现,例如Point<int>

  2. 类模板的成员函数本身就是函数模板,使用相同的模板参数,只是将模板参数提供给类,而不是函数,就像在下面示例中函数Point<T>::moveTo实现的那样。

  3. 每当使用不同的模板参数时,编译器就会生成一个新的类实例,具有新的成员函数。
    也就是说,Point<int>::moveTo是一个函数,Point<double>::moveTo是另一个函数,这正是手动编写这些函数会发生的情况。如果两个不同的源文件都使用Point<int>,编译器和链接器会确保它们共享同一个模板实例。

  4. 也正因为如此不能把一个Point<int>对象赋给一个Point<float>对象,详见下面代码中注释掉的pt3 = pt2后面的报错信息。

  5. 下面代码也给出了类内又有模板的实现方式。

#include <iostream>
#include <vector>

template<class T>
class Point{
public:
    Point(T x, T y):x_(x), y_(y){
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }

    Point(const Point& pt): x_(pt.x_), y_(pt.y_){
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    Point& operator=(const Point& pt)& {
        Point(pt.x_, pt.y_).swap(static_cast<Point&>(*this));
        std::cout << __PRETTY_FUNCTION__ << std::endl;

        return *this;
    }

    Point(Point&& pt) noexcept: x_(pt.x_), y_(pt.y_) {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    Point& operator=(Point&& pt)& noexcept{
        x_ = pt.x_;
        y_ = pt.y_;
        std::cout << __PRETTY_FUNCTION__ << std::endl;

        return *this;
    }

    void swap(Point& pt) noexcept{
        std::swap(x_, pt.x_);
        std::swap(y_, pt.y_);
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }

    virtual ~Point(){
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }

    T getX()const{
        return x_;
    }
    T getY()const{
        return y_;
    }

    void moveTo(T x, T y);

    /*【类内又有模板】方式一,在类内声明,在类外定义 */
    template<class U>
    U ratio() ;

    /*【类内又有模板】方式二,在类内定义 */
    template<class V>
    V multiply() {
        return static_cast<V>(x_) * static_cast<V>(y_);
    }

private:
    T x_;
    T y_;
};

template<class T>
void Point<T>::moveTo(T x, T y){
    x_ = x;
    y_ = y;
}

template<class T>
template<class U>
U Point<T>::ratio() {
    return static_cast<U>(x_) / static_cast<U>(y_); // omit devided by zero.
}

int main() {
    Point<int> pt1(1, 2);
    Point<float> pt2(3.4, 5.6);

    Point<int> pt3(pt1);
    pt3 = pt1;
    //pt3 = pt2;  // error: no match for 'operator=' (operand types are 'Point<int>' and 'Point<float>')

    std::cout << "x = "<< pt3.getX() << ", y = " << pt3.getY() << std::endl;  // x = 1, y = 2】

    pt3.moveTo(5, 6);

    std::cout << "x = "<< pt3.getX() << ", y = " << pt3.getY() << std::endl;  // x = 5, y = 6

    std::cout << pt3.ratio<float>() << std::endl;     // 0.833333
    std::cout << pt3.multiply<float>() << std::endl;  // 30
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/596779.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM——用于微调预训练大型语言模型(LLM)的GPU内存优化与微调

前言 GPT-4、Bloom 和 LLaMA 等大型语言模型&#xff08;LLM&#xff09;通过扩展至数十亿参数&#xff0c;实现了卓越的性能。然而&#xff0c;这些模型因其庞大的内存需求&#xff0c;在部署进行推理或微调时面临挑战。这里将探讨关于内存的优化技术&#xff0c;旨在估计并优…

2025第23届太原煤炭(能源)工业技术与装备展览会

第二十三届太原煤炭&#xff08;能源&#xff09;工业技术与装备展览会 邀 请 函 指导单位&#xff1a; 中国煤炭工业协会 主办单位&#xff1a;山西省煤炭工业协会 承办单位&#xff1a;太原奇新展览有限公司 展览时间&#xff1a;2025年4月22-24日 展览地点&#xff1a…

jenkins+gitlab+sonar自由风格项目配置

新建项目&基本配置 gitlab侧配置 sonar.projectKeytest_sonar sonar.projectNametest_sonar sonar.projectVersion1.0 sonar.sources. sonar.exclusionssrc/layout/** sonar.sourceEncodingUTF-8 sonar.nodejs.executable/app/nodejs/node-v16.20.2-linux-x64/bin/node配置…

cURL:命令行下的网络工具

序言 在当今互联网时代&#xff0c;我们经常需要与远程服务器通信&#xff0c;获取数据、发送请求或下载文件。在这些情况下&#xff0c;cURL 是一个强大而灵活的工具&#xff0c;它允许我们通过命令行进行各种类型的网络交互。本文将深入探讨 cURL 的基本用法以及一些高级功能…

智能AI摄像头项目

项目概要 硬件说明&#xff1a;易百纳rv1126 38板&#xff0c;易百纳GC2053摄像头&#xff0c;拓展版&#xff08;自绘&#xff09;&#xff0c;屏幕驱动板&#xff08;自绘&#xff09;&#xff0c;3.1inch mipi屏&#xff0c;FT5316触摸屏 开发环境 硬件分析 开发环境及sd…

数据结构十一:数组相关经典面试题

本篇博客详细介绍分析数组/顺序表常见的面试题&#xff0c;对于前面所学知识进行一个巩固&#xff0c;同时介绍一些力扣刷题中的一些概念&#xff1a;如&#xff1a;输出型参数等&#xff0c;在刷题中培养自己的编程思维&#xff0c;掌握常见的编程套路&#xff0c;形成题感&am…

KernelSU 如何不通过模块,直接修改系统分区

刚刚看了术哥发的视频,发现kernelSU通过挂载OverlayFS实现无需模块,即可直接修改系统分区,很是方便,并且安全性也很高,于是便有了这篇文章。 下面的教程与原视频存在差异,建议观看原视频后再结合本文章进行操作。 在未进行修改前,我们打开/system/文件夹,并在里面创建…

Junit 测试中如何对异常进行断言

本文对在 Junit 测试中如何对异常进行断言的几种方法进行说明。 使用 Junit 5 如果你使用 Junit 5 的话,你可以直接使用 assertThrows 方法来对异常进行断言。 代码如下: Exception exception = assertThrows(NumberFormatException.class, () -> {new Integer("on…

fiscobcos 3.x linux安装与java简单调用

所用环境 vmware 16 Pro centos7.6 jdk11.0.6 ideal 2022 1、安装fiscobcos # 创建操作目录 # cd ~ && mkdir -p fisco && cd fisco# 下载建链脚本 # curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v3.6.0/build_chain.sh &a…

Spring Security + JWT 实现登录认证和权限控制

Spring Security JWT 实现登录认证和权限控制 准备步骤 准备好一些常用的工具类&#xff0c;比如jwtUtil&#xff0c;redisUtil等。引入数据库&#xff0c;mybatis等&#xff0c;配置好controller&#xff0c;service&#xff0c;mapper&#xff0c;保证能够正常的数据请求。…

【python】条件语句与循环语句

目录 一.条件语句 1.定义 2.条件语句格式 &#xff08;1&#xff09;if &#xff08;2&#xff09;if-else &#xff08;3&#xff09;elif功能 &#xff08;4&#xff09;if嵌套使用 3.猜拳游戏 二.循环语句 1. while循环 2.while嵌套 3.for循环 4.break和conti…

k8s部署skywalking(helm)

官方文档 官方文档说明&#xff1a;Backend setup | Apache SkyWalking官方helm源码&#xff1a;apache/skywalking-helm官方下载&#xff08;包括agent、apm&#xff09;:Downloads | Apache SkyWalking 部署 根据官方helm提示&#xff0c;选择你自己部署的方式&#xff0c…

PyTorch深度学习框架:从入门到实战

前言 学习 PyTorch 深度学习框架之前先学会深度学习和卷积神经网络 CNN &#xff0c;这样学习起来会更香嗷。 Windows系统下PyTorch的环境配置 Anaconda是什么&#xff1a; Anaconda是一个开源的Python发行版本&#xff0c;专注于数据分析领域。它包含了conda、Python等190多…

解决python/pycharm中import导入模块时报红却能运行的问题

一、问题 导入时报红&#xff0c;如下 二、解决 右键单击项目&#xff0c;将项目Mark Directory as→Sources Root 三、效果 报红消失 学习导航&#xff1a;http://www.xqnav.top

Docker网络基础

简介 Docker 本身的技术依赖于近年来 Linux 内核虚拟化技术的发展,Docker 对 Linux 内核的特性有很强的依赖。Docker 使用到的与 Linux 网络有关的主要技术有:网络命名空间、veth 设备对、网桥、ipatables 、路由。 网络命名空间 为了支持网络协议栈的多个实例,Linux在网络栈…

使用Docker安装Jenkins

大家好&#xff0c;今天给大家分享如何使用docker安装jenkins&#xff0c;关于docker的安装和常用命令可以参考下面两篇文章&#xff0c;使用docker可以提高资源利用率&#xff0c;能够在不同的环境中轻松迁移和部署应用&#xff0c;在本文中就不过多赘述了。 Docker常用命令 …

大数据BI可视化(Echarts组件)项目开发-熟悉动画使用功能4.0

加载动画 数据源 [{ "gender": "female", "height": 161.2, "weight": 51.6 }, { "gender": "female", "height": 167.5, "weight": 59 }, { "gender": "female", &quo…

opencv基础篇 ——(十六)图形绘制与填充

OpenCV 提供了丰富的图形绘制和填充功能&#xff0c;主要通过 cv::rectangle, cv::circle, cv::line, cv::polylines, cv::fillPoly 和 cv::ellipse 等函数实现。以下是一些基本的图形绘制和填充操作的说明&#xff1a; 矩形: 函数: cv::rectangle语法: cv::rectangle(img, rec…

一文2500字Robot Framework自动化测试框架超强教程

1、Robot Framework简介 Robot Framework是一个基于Python的可扩展关键字驱动的自动化框架&#xff0c;用于验收测试&#xff0c;验收测试驱动开发&#xff08;ATDD&#xff09;&#xff0c;行为驱动开发&#xff08;BDD&#xff09;和机器人流程自动化&#xff08;RPA&#xf…

SqlException 口令已经失效

Orcle密码过期了 //查看过期时间 SELECT * FROM dba_profiles s WHERE s.profileDEFAULT AND resource_namePASSWORD_LIFE_TIME;//修改过期时间 alter PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
最新文章