C++入门基础知识八

1.介绍new与delete

1.malloc和free是函数,new和delete是操作符

2.malloc申请的空间不会初始化,new可以初始化

3.malloc申请空间失败时,返回的是NULL,因此必须判空,new不需要,但是new需要捕获异常

4.申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的释放和清理

5.malloc申请空间时,需要手动计算空间大小并传递,new只需要在其后跟空间类型就可以,如果申请是多个对象,[]中指定对象个数

2.模板介绍

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
void Swap(double& left, double& right)
{double temp = left;left = right;right = temp;
}
void Swap(char& left, char& right)
{char temp = left;left = right;right = temp;
}

如果是实现交换函数的话,写这么多函数重载,但其实这些函数的区别只有函数参数的类型不一样,代码代码复用率比较低,要是有新类型出现就需要用户再去写,所以可以写一个模板。

泛型编程:编写与类型无关的通用代码,是代码复写的手段。模板是泛型编程的基础

函数模板格式:

template<typename T1,typename T2,······,typename Tn>

注意:typename是用来定义模板参数关键字,也可以使用class

函数模板是一个蓝图,它本身不是函数,是编译器使用方式产生特定类型函数的模具,所以其实模版就是将本来我们应该做的事情交给编译器

在编译器阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对于类型的函数以供调用,比如:但double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后生成一份专门处理double类型的代码。

实例1:

template<typename T>void Swap(T& a, T& b)
{T tmp = a;a = b;b = tmp;
}int main()
{int a = 1;int b = 2;cout << a << " " << b << endl;Swap(a, b);cout << a << " " << b << endl;return 0;
}

 实例2:

template<typename T>void Swap(T& a, T& b)
{T tmp = a;a = b;b = tmp;
}int main()
{int a = 1;int b = 2;double c = 3.3;double d = 4.4;Swap(a, c);return 0;
}

这样子会报错是因为,在编译期间,当编译器看到该实例化时,需要推演实参类型,通过实参a将T推演为int,通过实参c将T推演为double类型,当模板参数列表只有一个T,所以编译器不确定是哪一个。

处理1:通过强制转换

Swap(a,(int)c)

处理2:使用显示实例化 

Swap<int>(a,c)

显式实例化就是告诉编译器T是int,不用编译器去推演T的类型

3.模板参数的匹配原则

1.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数

 

template<typename T>void Swap(T& a, T& b)
{T tmp = a;a = b;b = tmp;
}void Swap(int a, int b)
{int tmp = a;a = b;b = tmp;
}
int main()
{int a = 1;int b = 2;double c = 3.3;double d = 4.4;Swap(a, b);return 0;
}

如果推演的与非模板一样则就会使用非模板函数

如果使用显示实例化就会用模板函数

 

对于非模板函数和同名函数模板,如果其它条件相同,在调用时会优先调用非模板函数而不会从该模板产生一个实例,如果模板可以产生一个匹配更好的函数才会调用模板

int Add(int a, int b)
{return a + b;
}
template<typename T1,typename T2>
T1 Add(T1& a, T2& b)
{return a + b;
}
int main()
{int a = 1;int b = 2;double c = 3.3;//Swap<int>(a, b);Add(1, 2);Add(a, c);return 0;
}

非模板是俩个int相加,模板则是俩个可推演的类型,当参数不同为int时就会使用模板的而不是非模板。 

模板参数兼容的类型有:

1.基本数据类型:如 int、double、char、bool 等。
2.自定义类和结构体:用户定义的类型,如 struct 或 class。
3.指针类型:如 int*、double* 等。
4.引用类型:如 int&amp;、const double&amp; 等。
5.标准库类型:如 std::vector&lt;T&gt;、std::string 等。
6.枚举类型:自定义的 enum 类型。

只要在调用模板时传入的类型与 T 兼容,编译器就能成功推导出模板参数。

类模板

类模板定义格式

template<class T1,class T2,······,class Tn>

class A

{

        //内容

}; 

 

template<class T>
class zym
{
public:zym(size_t capacity = 10):_Date(new T[capacity]),_size(0),_capacity(capacity){}~zym();
private:T* _Date;size_t _size;size_t _capacity;
};
template<class T>
zym<T>::~zym()
{//
}
int main()
{zym<int> a;return 0;
}

如果在类外定义析构还需要再写一次模板,告诉编译器这个函数是这个模板的析构函数

在 C++ 中,类的成员函数(包括析构函数)的定义需要在类外部进行时,必须明确指定模板参数。这是因为编译器需要知道该成员函数与哪个模板实例相关联。
原因

1.模板实例化:
当你在类内部声明一个模板成员函数时,编译器不会自动生成它的定义。你需要在外部明确告诉编译器该成员函数是为哪个特定类型的实例化而定义的。
2.编译器的工作方式:
编译器在处理模板时,会在需要时生成特定类型的代码。如果你在类外部定义析构函数而不指明模板参数,编译器无法知道该函数属于哪个具体的模板实例。

示例
template &lt;class T&gt;
class zym {
public:
    zym(size_t capacity = 10);
    ~zym();
private:
    T* _Date;
    size_t _size;
    size_t _capacity;
};

// 外部定义析构函数,必须指定模板参数
template &lt;class T&gt;
zym&lt;T&gt;::~zym() {
    delete[] _Date;  // 释放内存
}

总结
在外部重新写一次模板参数是为了清晰地告诉编译器这个成员函数属于哪个模板实例。这是 C++ 模板机制的一个基本要求。

4.模板实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后面跟<>,然后将实例化的类型放在<>中,类模板名字不是真正的类,实例化的结果才是真正的类

zym<int> s1;

//zym是类名,zym<int> 才是类 

5.栈的实现 

template<typename T>
class Stack
{
public:Stack(int n = 4):_array(new T[n]),_size(0),_capacity(n){}~Stack(){delete[] _array;_array = nullptr;_size = _capacity = 0;}void Push(const T& x);private:T* _array;size_t _capacity;size_t _size;
};template<class T>
void Stack<T>::Push(const T& x)
{if (_size == _capacity){T* tmp = new T[_capacity * 2];memcpy(tmp, _array, sizeof(T) * _size);delete[] _array;_array = tmp;_capacity *= 2;}_array[_size++] = x;
}int main()
{// 类模板都是显示实例化Stack<int> st1; // intst1.Push(1);st1.Push(2);st1.Push(3);Stack<double> st2; // doublest2.Push(1.1);st2.Push(1.1);st2.Push(1.1);Stack<double>* pst = new Stack<double>;//...delete pst;return 0;
}

 

首先pst指向的是堆区上的一个地址,内容是私有成员变量,私有成员变量_array有指向堆区上的一片空间,当delete pst时,会先调用Stack的析构函数释放_array指向的空间,然后再释放私有成员变量的空间。

6.string类的简单介绍

int main()
{string s1;string s2("hello world");string s3(s2);cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;//cin >> s1;//cout << s1 << endl;string s4(s2, 6, 2);cout <<"s4:"<< s4 << endl;string s5(s2, 6);cout << "s5:"<<s5 << endl;string s6("hello world", 5);cout << "s6:"<<s6 << endl;string s7(10, 'X');cout << "s7:"<<s7 << endl;//s6[10];s6[0] = 'x';cout << s6 << endl;return 0;
}

 

s1没有内容为空

s2参数为“hello world”

s3是拷贝了s2

s4是需要一个string类的实例,6是从第六个开始,2是取俩个字符停下(若超过能取的最长也只能取到最后一个停止)

s5是从第六个开始到最后一个取完

s6是取“hello world”的前五个

s7是把‘X’重复十次来实例

s6有用了operator[]把索引为0的地方重新赋值为‘x’ 

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

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

相关文章

Kyutai 开源对话模型 Moshi;李飞飞空间智能公司已筹集超过 2.3 亿美元丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

OpenAI GPT o1技术报告阅读(3)-英文阅读及理解

✨继续阅读报告&#xff1a;使用大模型来学习推理(Reason) 原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 这次我们继续看一个英文阅读理解的案例。 原问题&#xff1a; The following passage is the draft of an excerpt from a contempora…

Web开发:ABP框架3——入门级别的接口增删改查实现原理

一、上节回顾 运用了ABP框架&#xff0c;使用了EFcore进行增删改查 二、程序的入口 代码解说&#xff1a; public class Program // 定义程序主类 {public async static Task<int> Main(string[] args) // 主方法&#xff0c;返回状态码{// 配置Serilog日志Log.Logger…

手机换新,怎么把旧iPhone手机数据传输至新iPhone16手机

随着苹果公司推出了备受期待的iPhone 16。这款最新型号的iPhone不仅在设计上进行了革新&#xff0c;更在性能和功能上带来了前所未有的突破。对于那些准备从旧iPhone升级到iPhone 16的用户来说&#xff0c;最关心的问题之一就是如何把旧手机的资料转移到新手机中了。如果你不知…

Java从入门到精通学习框架(二)

在这个阶段&#xff0c;重点是掌握 Java 的高级特性&#xff0c;理解和应用常见的数据结构、Java 的并发编程模型&#xff0c;以及深入理解 Java 的内存管理机制等。通过这一阶段的学习&#xff0c;你将能够编写更加复杂和高效的程序&#xff0c;并为后续的框架学习打下坚实基础…

深度学习-图像处理篇1.1-1.2神经网络

1.1卷积神经网络基础 卷积层 对彩色RGB图像进行卷积 1.卷积核的通道数与输入特征层的通道数相同 2.卷积输出的特征矩阵通道数与卷积核个数相同 池化层 池化中一般池化核大小和步长大小一样 思考 加上偏移量bias该如何计算? 卷积计算时加上偏移量即可 加上激活函数该如何计…

Python画笔案例-055 绘制七彩浪花

1、绘制七彩浪花 通过 python 的turtle 库绘制 七彩浪花&#xff0c;如下图&#xff1a; 2、实现代码 绘制七彩浪花&#xff0c;以下为实现代码&#xff1a; """七彩浪花.py """ import turtlecs [red,orange,yellow,green,cyan,blue,magenta]…

E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning

论文汇总 存在的问题 1.以前的提示微调方法那样只关注修改输入&#xff0c;而应该明确地研究在微调过程中改进自注意机制的潜力&#xff0c;并探索参数效率的极限。 2.探索参数效率的极值来减少可调参数的数量? 解决办法 提示嵌入进行transformer中 提示剪枝 Token-wise …

OpenCV_距离变换的图像分割和Watershed算法详解

在学习watershed算法的时候&#xff0c;书写代码总会出现一些错误&#xff1a; 上述代码运行报错&#xff0c;显示OpenCV(4.10.0) Error: Assertion failed (src.type() CV_8UC3 && dst.type() CV_32SC1) in cv::watershed 查找资料&#xff1a;目前已解决 这个错…

CentOS7搭建Hadoop3集群教程

一、集群环境说明 1、用VMware安装3台Centos7虚拟机 2、虚拟机配置&#xff1a;2C&#xff0c;2G内存&#xff0c;50G存储 3、集群架构设计 从表格中&#xff0c;可以看出&#xff0c;Hadoop集群&#xff0c;主要有2个模块服务&#xff0c;一个是HDFS服务&#xff0c;一个是YAR…

wordpress更换域名后用户图片头像不显示

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

【Python报错已解决】AttributeError: ‘DataFrame‘ object has no attribute ‘append‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

基于深度学习的文本情感原因提取研究综述——论文阅读

前言 既然要学习情感分析&#xff0c;那么肯定还要了解情感原因对抽取的发展历程&#xff0c;所以我又搜了一篇研究综述&#xff0c;虽然是2023年发表的&#xff0c;但是里面提及到的历程仅停留到2022年。这篇综述发布在TASLP期刊&#xff0c;是音频、声学、语言信号处理的顶级…

【论文解读系列】用于自监督点云表示的生成变分对比学习

Generative Variational-Contrastive Learning for Self-Supervised Point Cloud Representation | IEEE Transactions on Pattern Analysis and Machine Intelligence (acm.org) 作者&#xff1a;Bohua Wang; Zhiqiang Tian; Aixue Ye; Feng Wen; Shaoyi Du; Yue Gao 摘要 三…

Coggle数据科学 | 科大讯飞AI大赛:玉米雄穗识别挑战赛

本文来源公众号“Coggle数据科学”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;科大讯飞AI大赛&#xff1a;玉米雄穗识别挑战赛 赛题名称&#xff1a;玉米雄穗识别挑战赛 赛题类型&#xff1a;计算机视觉、物体检测 赛题任务&…

LeetCode_sql_day30(1264.页面推荐)

描述 1264.页面推荐 朋友关系列表&#xff1a; Friendship ------------------------ | Column Name | Type | ------------------------ | user1_id | int | | user2_id | int | ------------------------ (user1_id, user2_id) 是这张表具有唯一值的…

HT326 免电感滤波2x20W D类立体声音频功放

特点 输出功率(BTL模式) 2x20W (VDD14.5V,RL4Ω,THDN1%) 单电源系统: 4.5V-18V; 超过90%效率&#xff0c;无需散热器 扩频功能&#xff0c;免电感滤波 模拟差分/单端输入可选 增益:32dB 保护功能:过压/过流/过热/欠压异常&#xff0c;直流检测 和短路保护 无铅无卤封装&#x…

Python画笔案例-054 绘制流光溢彩动画

1、绘制流光溢彩动画 通过 python 的turtle 库绘制 流光溢彩动画&#xff0c;如下图&#xff1a; 2、实现代码 绘制流光溢彩动画&#xff0c;以下为实现代码&#xff1a; """本程序实现流光溢彩的动画效果 """ from turtle import * from color…

流动网红打卡车!苏州金龙海格双层巴士带你体验别样津门津韵

近日&#xff0c;由文化和旅游部主办&#xff0c;天津市文化和旅游局等单位承办的2024中国文化旅游产业博览会在天津拉开帷幕&#xff0c;展会期间&#xff0c;来自全国各地的文旅产品精彩亮相。而在天津交通集团展台&#xff0c;来自苏州金龙海格客车制造的网红双层观光“音乐…

YOLOv8改进 - 注意力篇 - 引入ECA注意力机制

一、本文介绍 作为入门性第一篇&#xff0c;这里介绍了ECA注意力在YOLOv8中的使用。包含ECA原理分析&#xff0c;ECA的代码、ECA的使用方法、以及添加以后的yaml文件及运行记录。 二、ECA原理分析 ECA官方论文地址&#xff1a;ECA文章 ECA的pytorch版代码&#xff1a;ECA的…