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

news/2024/10/14 16:20:30

类模板应用

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 oncetemplate<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

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

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

相关文章

Unity 热更--AssetBundle学习笔记 0.7

AssetBundle AB包是什么? AssetBundle又称AB包,是Unity提供的一种用于存储资源的资源压缩包。 Unity中的AssetBundle系统是对资源管理的一种扩展,通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,可以动态地加载和卸载AB包,继而有选择地加载内容。 AB包的…

2024年4月文章一览

2024年4月编程人总共更新了5篇文章: 1.2024年3月文章一览 2.《自动机理论、语言和计算导论》阅读笔记:p139-p171 3.《自动机理论、语言和计算导论》阅读笔记:p172-p224 4.《自动机理论、语言和计算导论》阅读笔记:p225-p260 5.《自动机理论、语言和计算导论》阅读笔记:p26…

开源文档预览项目 kkFileView (9.9k star) ,快速入门

kkFileView 是一款文件文档在线预览解决方案,采用流行的 Spring Boot 框架构建,易于上手和部署。 该项目基本支持主流办公文档的在线预览,包括但不限于 doc、docx、xls、xlsx、ppt、pptx、pdf、txt、zip、rar,以及图片、视频、音频等格式。1 Docker 部署拉取镜像:# 网络环…

模拟集成电路设计系列博客——6.2.4 电流模式转换器

6.2.4 电流模式转换器 电流模式D/A转换器与电阻型转换器非常类似,但是可以用于更高速的应用。其基本的思想是将电流切换到输出或到地,如下图所示:因此输出电流通过\(R_F\)转换成电压,而每个电流源的上节点总是保持在地电压。电流型D/A转换器将在后续的温度计码D/A转换器章节…

模拟集成电路设计系列博客——6.2.3 电荷重分布开关电容转换器

6.2.3 电荷重分布开关电容转换器 电荷重分布开关电容转换器的基本思想是将开关电容增益放大器的输入电容替换为一个可编程电容阵列(PCA,Programmable Capacitor Array),如下图所示:如我们之前在开关电容增益放大器时讨论的一样,上图中的电路对于放大器输入失调电压,\(1/…

CF981F Round Marriage

传送门首先最小化最大,一眼鉴定为二分。二分这个最大值 \(k\),问题变成判断是否能让新郎新娘匹配,每一对距离 \(\le k\)。 如果把新郎新娘视作二分图,每个点只和距离 \(\le k\) 的点连边,问题就是求是否有完美匹配。 完美匹配判定,可以联想到 Halls 定理。 先把环复制一遍…

linux12-root

linux12-root为root用户设置密码 sudo passwd rootsu su, switch user, 切换用户 选项 -, 表示是否在切换用户后加载环境变量, 建议加 参数user不填写, 默认切换root用户 # 切换到root用户 su - root可以通过exit回退到上一个用户, 也可以用快捷键ctrl+dsudo super user do, 为…

PC-100垂直拉制仪使用指南

序言现在大部分的实验室配置的都是水平拉制仪(大部分是Sutter的P-97和P-1000)的普及,很多新的实验室也没有人配备垂直拉制仪,但是垂直拉制仪在制备锥度较长的吸附针呀、注射病毒这种用途时,比水平拉制仪更具优势,有时候,在水平拉制仪出故障或者比较急时,一些实验室也会…