首页 > 其他分享 >类模板的简单应用(用于存储不同类型数据的类容器)

类模板的简单应用(用于存储不同类型数据的类容器)

时间:2024-05-01 23:55:25浏览次数:22  
标签:容器 存储 int back MyArray pAddress 构造函数 模板 Size

类模板应用

explicit

explicit 是一个关键字,用于指定该构造函数是显式构造函数。在C++中,当一个类的构造函数只有一个参数时,它可以被用于隐式类型转换,这可能会导致意想不到的行为和潜在的错误。为了避免这种情况,可以使用 explicit 关键字来声明该构造函数,表示禁止隐式类型转换,只能显式地调用该构造函数来创建对象。

#include <iostream>

class MyClass {
public:
    explicit MyClass(int x) {
        std::cout << "Explicit constructor called with " << x << std::endl;
    }
};

void func(MyClass obj) {
    std::cout << "Function called" << std::endl;
}

int main() {
    // 显式调用
    MyClass obj1(10);

    // 隐式调用,会触发显式构造函数,因为 MyClass 只有一个参数的构造函数,并且使用了 explicit 关键字
    // MyClass obj2 = 20; // 编译错误,禁止隐式类型转换
    MyClass obj3 = MyClass(20); // 显式调用

    // 隐式调用,会触发隐式构造函数
    func(30); // 隐式调用构造函数,然后调用函数

    return 0;
}

image-20240426104414407

必须显式的去写一句实例化的语句才能进行构造。

image-20240426104541272

知道这个explicit关键字之后开始应用。

代码

设计一个数组模板类(MyArray),完成对不同类型元素的管理

#pragma once

template<class T>
class MyArray
{
public:
    explicit MyArray(int capacity)
    {
        this->m_Capacity = capacity;
        this->m_Size = 0;
        // 如果 T 是对象,那么这个对象必须提供默认的构造函数
        pAddress = new T[this->m_Capacity];
    }

    // 拷贝构造
    MyArray(const MyArray& arr)
    {
        this->m_Capacity = arr.m_Capacity;
        this->m_Size = arr.m_Size;
        this->pAddress = new T[this->m_Capacity];
        for (int i = 0; i < this->m_Size; i++)
        {
            this->pAddress[i] = arr.pAddress[i];
        }
    }

    // 重载[] 操作符  arr[0]
    T& operator [](int index)
    {
        return this->pAddress[index];
    }

    // 尾插法
    void push_back(const T& val)
    {
        if (this->m_Capacity == this->m_Size)
        {
            return;
        }
        this->pAddress[this->m_Size] = val;
        this->m_Size++;
    }

    void pop_back()
    {
        if (this->m_Size == 0)
        {
            return;
        }
        this->m_Size--;
    }

    // 获取大小的 const 成员函数
    int getSize() const
    {
        return this->m_Size;
    }

    // 析构
    ~MyArray()
    {
        if (this->pAddress != nullptr)
        {
            delete[] this->pAddress;
            this->pAddress = nullptr;
            this->m_Capacity = 0;
            this->m_Size = 0;
        }
    }

private:
    T* pAddress;  // 指向一个堆空间,这个空间存储真正的数据
    int m_Capacity; // 容量
    int m_Size;   // 大小
};

首先实现的是构造函数,规定好必须显式的声明实例化,一个是为了隐式转换专门构造的一种方法,但其实这个过程并不是计算机进行的隐式,因为我们有专门的代码去编译。还有一个就是拷贝构造。

T& operator [](int ind) {
	return this->ptr[ind];
}
void push_back(const T& ele) {
	if (this->capacity == this->Msize) {
		return;
	}
	this->ptr[this->Msize] = ele;
	this->Msize++;
}
void pop_back() {
	if (this->Msize == 0) {
		return;
	}
	this->Msize--;
}
int get_size() {
	return this->Msize;
}
~MyArray() {
	if (this->ptr != NULL) {
		delete []this->ptr;
		this->pAddress = NULL;
		this->capacity = 0;
		this->Msize = 0;
	}
}

这段代码里实现了入队和出队的功能,并且将之前学的重载操作符也用上了。测试代码里我们试图调用多个构造函数去理解代码的过程。

#include <iostream>
#include "MyArray.hpp"
using namespace std;

class Person {
public:
	Person(){}
	Person(string name, int age) {
		this->name = name;
		this->age = age;
	}
public:
	string name;
	int age;
};

void PrintArrayInt(MyArray<int>& arr) {
	for (int i = 0; i < arr.get_size(); i++) {
		cout << arr[i] << " ";
	}
	cout << endl;
}

void PrintArrayPerson(MyArray<Person>& arr) {
	for (int i = 0; i < arr.get_size(); i++) {
		cout << "姓名:" << arr[i].name << " 年龄: " << arr[i].age << endl;
	}
	cout << endl;
}

int main() {
	MyArray<int> ArrayInt(10); //通过显式转换
	for (int i = 0; i < 9; i++)
	{
		ArrayInt.push_back(i);
	}
	ArrayInt.push_back(127);
	PrintArrayInt(ArrayInt);

	Person p1("regina", 23);
	MyArray<Person> ArrayPerson(p1);//通过我们构造好的隐式转换
	Person p2("ivanlee", 20);
	Person p3("daji", 18);
	Person p4("dianwei", 15);
	Person p5("paofu", 24);

	ArrayPerson.push_back(p2);
	ArrayPerson.push_back(p3);
	ArrayPerson.push_back(p4);
	ArrayPerson.push_back(p5);
	PrintArrayPerson(ArrayPerson);
	return 0;
}

image-20240501234937921

标签:容器,存储,int,back,MyArray,pAddress,构造函数,模板,Size
From: https://www.cnblogs.com/ivanlee717/p/18169832

相关文章

  • docker之旅 10.容器实战-部署tars微服务框架
    参考地址:https://doc.tarsyun.com/#/installation/docker.mdhttps://github.com/TarsCloud/Tarshttps://hub.docker.com/r/tarscloud/base-deploy https://tarscloud.gitbook.io/tarsdocs/kuang-jia-bu-shu/docker 前提:假设你已经安装好了docker,docker-compose。如......
  • 容器网络流量转发分析
    1、docker容器bridge网络模式【docker】#同一节点不同容器流量转发1.1、通过iptables-tnat-nvL|grep6008查看端口服务的转发规则,可查到对应的容器ip、端口和网卡1.2、查看容器路由表,172.17.0.x目标网段,流量会从eth0出去和进来【veth网络设备接口的一端】 1.3、查看......
  • kube-ovn 默认vpc和默认subnet 主机和容器互通
    默认vpc是ovn-cluster,默认subnet是ovn-default。ovn0ip是100.64.0.0/16网段。同节点容器访问主机主机访问容器跨节点容器访问主机主机访问容器 ......
  • leetcode算法热题--盛最多水的容器
    题目给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释......
  • 关于在CentOS7的docker容器下启动MySQL5.7.44卡住的问题的解决办法
    最近想在docker中跑一个MySQL5.7版本的服务,而且要基于CentOS,所以着手自己构建镜像。容器的构建参照下面这篇文章基于CentOS7镜像容器的MySQL环境构筑-sxb_sunday-博客园(cnblogs.com)构建完成后,用下面命令启动MySQL服务的时候,启动进程一直卡住没有反应,只能CTRL+C强制停止。......
  • 06-混入-自定义插件-插槽-本地存储-vuex组件通信-页面跳转
    混入mixin在Vue中,混入(mixin)是一种可以在多个组件中重复使用的对象。它允许您将组件中的一些选项提取出来,然后在多个组件中进行重复使用。混入可以包含组件中的任何选项,例如数据、计算属性、方法等。使用步骤在src文件夹下新建一个文件夹,比如mixin,然后再这个文件夹下面新建一......
  • 在 .net core 3.1 的 docker 镜像生成的容器中,连接 sql server 2008 r2 版本的数据库,
    错误1:{"ClassName":"System.Data.SqlClient.SqlException","Message":"Aconnectionwassuccessfullyestablishedwiththeserver,butthenanerroroccurredduringthepre-loginhandshake.(provider:TCPProvider,......
  • 在密码学中,“加盐”(Salting)是指在存储用户密码的哈希值之前,向原始密码添加一个随机生
    在密码学中,“加盐”(Salting)是指在存储用户密码的哈希值之前,向原始密码添加一个随机生成的字符串(称为“盐”Salt)的过程。这个盐值通常是全球唯一的,并且与每个用户账户相关联,存储在数据库中与哈希值一起。加盐的目的主要有两个:抵御彩虹表攻击:彩虹表是一种预先计算好的哈希值对照表......
  • [转帖]WEB请求处理三:Servlet容器请求处理
    https://www.jianshu.com/p/571c474279af 0系列目录#WEB请求处理WEB请求处理一:浏览器请求发起处理WEB请求处理二:Nginx请求反向代理本篇文章将给大家讲述Servlet容器中请求处理的过程,在给本篇文章起标题时,一直在“应用服务器”与“Servlet容器”这两者之间......
  • 全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)
    作者:余凯前言近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的IaaS化到现在的微服务化,客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度,也一直在高速的发展和演进中,这必然对客户对云原生网络的可观测性带来了极高的门槛和挑战。为......