c++的构造函数赋值函数重载运算符等

news/2025/2/16 5:25:49/

文章目录

    • 一、前言
    • 二、正文
      • 1、拷贝构造函数
      • 2、赋值函数
      • 3、operator()() 重载()运算符
      • 4、类中方法前面的template
      • 5、类实例化的方式
        • (1)调用构造函数实例化和指针实例化
        • (2)类对象和类指针的区别
        • (3) 类指针和智能指针的区别
        • (4) 类指针和智能指针的转换
    • 三、后记

一、前言

      c++的类的特殊函数实在让人又爱又恨,构造函数,拷贝函数,移动构造,赋值函数,重载运算符等等…
      在给与我们很大操作空间的同时,学习曲线着实有些陡峭了。在此记录一下日常笔记,后续会不断补充类相关的函数,努力吧青年!

二、正文

参考:
c++的拷贝构造函数被调用的时机
C++的四个默认函数(构造函数,析构函数,拷贝函数,赋值函数)

1、拷贝构造函数

asrModel(const asrModel& other);
auto asr_model = std::make_shared<asrModel>(*this);

当类对象被用来初始化另一个对象的时候会触发。

2、赋值函数

参考:c++类中的赋值函数

InferReqWrap& operator=(const InferReqWrap& infer) {  //赋值函数if (this != &infer) {_request = infer._request;_id = infer._id;_callbackQueue = infer._callbackQueue;}return *this;}

      主要是为了重写operator=()函数,在函数中判断对象是否相等,不相等则把类中的成员变量都重新赋值一遍,然后返回类对象的引用。

3、operator()() 重载()运算符

参考:
C++类operator () 重载和函数对象
void operator()()的含义

void ConnectionHandler::operator()() { }

operator()()的含义:

1、第一个括号代表我要重载运算符()2、第二个括号代表重载时传入的参数,可以有参数,也可以不传入参数
效果:当实例化类的时候,会自动执行重载()方法中的逻辑。和构造函数的区别如下:

C++里仿函数是什么

1)首先是定义形式:
构造函数无返回值,而operator是可以有返回值的;
(2)定义时,构造函数需要类名,而重载operator()则不用;
(3)其次是调用形式:构造函数是声明对象,而仿函数则需要声明好的对象进行调用。
仿函数:
仿函数的意思是:它不是函数(其实是个类),但用法和函数一样。既然是个类,就可以存储很多变量和其他的信息,然后实现纯函数实现不了的功能。所以在一些需要函数作为参数的地方可以用仿函数代替。在STL里很多地方用到了仿函数。

4、类中方法前面的template

参考:c++类模版详解

      类模板与函数模板的定义和使用类似,有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,我们可以通过声明模版类的方式,实现多种数据类型的兼容。
子类从模板类继承的时候,需要让编译器知道 父类的数据类型具体是什么

1.父类一般类,子类是模板类, 和普通继承的玩法类似
2.子类是一般类,父类是模板类,继承时必须在子类里实例化父类的类型参数
3.父类和子类都时模板类时,子类的虚拟的类型可以传递到父类中

5、类实例化的方式

参考:
C++里面四种智能指针的使用及区别
类指针与智能指针

(1)调用构造函数实例化和指针实例化

//调用类的构造函数,返回类对象
C obj1("o1", 11, 111);
obj1.memberFunction1();
//使用new实例化类,返回指针
C *obj2 = new C("O2", 22, 222.0);
obj2->memberFunction1();

(2)类对象和类指针的区别

ⅰ. 内存空间与生命期不同

      二者的类型决定了它们在内存上的分布不同。一个是对象类型,在创建时就已为对象分配好内存空间,用的是内存栈,是个局部的临时变量,作用域在该函数体内,随函数的结束被释放。一个是指针类型,用的是内存堆,是个永久变量,在调用时需要先用new分配动态内存,用完后必须手动delete掉。 如不想手动delete也可使用智能指针。

ii.调用方式上的不同

对象使用" . “操作符调用,而指针使用” -> "操作符调用。

iii.访问和传递的不同

      对象可直接访问,但不能实现多态,声明即调用了构造函数(已分配了内存);作为参数时,传递对象会调用拷贝构造函数,复制整个对象空间,参数传递占用资源大。
      指针变量是间接访问,但可实现多态(通过父类指针可调用子类对象,以及子对象中重写的父类虚函数),并且没有调用构造函数。

(3) 类指针和智能指针的区别

ⅰ. 对象在生命周期结束后会自动盗用析构函数释放内存,类指针需要通过 delete 来调用析构函数进行销毁,那指向的普通数据的指针却不会自动销毁,可能导致C++内存泄漏。
ⅱ. 智能指针在函数结束时会自动释放内存空间,不需要手动释放内存空间,这样就避免了内存泄漏
ⅲ. 智能指针成员函数

成员函数:
use_count 返回引用计数的个数
unique 返回是否是独占所有权( use_count 为 1)
swap 交换两个 shared_ptr 对象(即交换所拥有的对象)
reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少
get 返回内部对象(指针)   ---->可以把智能指针转换为类指针

(4) 类指针和智能指针的转换

test* pTest = new test();
std::shared_ptr<test> ptr_test = std::shared_ptr<test>(pTest); //普通指针转shared_ptrstd::shared_ptr<test> ptr_test2 = std::make_shared<test>();
test* pTest2 = ptr_test2.get(); //shared_ptr转普通指针

三、后记

      c++的类复杂程度确实比较高,想起写php时候的一把梭,写go时候的一顺到底,只能说不愧是你,cpp ! 这几年人工智能大火让大家开始追求算法工程化和性能,c++也跟着焕发第二春。但是在前几年应用大行其道各种高级语言漫天飞的时候,c++明显跟不上快速迭代的步伐,只能说一代版本一代神啊。

end


http://www.ppmy.cn/news/1880.html

相关文章

前端入门学习笔记四十六

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><p>JavaScript 赋值运算符</p><p id "a"></p><script>var h 10;h / 3;document.getEl…

【小f的刷题笔记】(JS)数组 - 差分数组 LeetCode1109 LeetCode1094

【数组】 差分数组&#xff1a; &#x1f31f; 频繁对原始数组的某个区间的元素进⾏增减 ✔ 把每个数与前一个数的差值计算出来存在一个新数组里&#xff0c;区间的加减通过把新数组中区间开始下标的值加/减&#xff0c;区间结束下标对应的值减/加&#xff08;反一下&#x…

LSTM内部结构及前向传播原理——LSTM从零实现系列(1)

一、前言 作为专注于时间序列分析的玩家&#xff0c;虽然LSTM用了很久但一直没有写过一篇自己的LSTM原理详解&#xff0c;所以这次要写一个LSTM的从0到1的系列&#xff0c;从模型原理讲解到最后不借助三方框架自己手写代码来实现LSTM模型。本文本身没有特别独到之处&#xff0c…

大厂程序员bibili技术学习分享

大厂程序员bibili技术学习分享

JAVA队列及实现类

什么是队列&#xff1f; 队列是一种特殊的线性表&#xff0c;遵循先入先出、后入后出的基本原则&#xff0c;一般来说&#xff0c;它只允许在表的前端进行删除操作&#xff0c;而在表的后端进行插入操作&#xff0c;但是java的某些队列运行在任何地方插入删除&#xff1b;比如我…

计算机毕业设计Java精品在线试题库系统(源码+mysql数据库+系统+lw文档)

计算机毕业设计Java精品在线试题库系统(源码mysql数据库系统lw文档&#xff09; 计算机毕业设计Java精品在线试题库系统(源码mysql数据库系统lw文档&#xff09;本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;id…

mysql基本命令

mysql -h localhost -u 用户名 -p密码 //連接數據庫 use desk_show; //使用數據庫 show tables; //顯示數據表 describe sys_att; …

Springboot漫画网站j846u计算机毕业设计-课程设计-期末作业-毕设程序代做

Springboot漫画网站j846u计算机毕业设计-课程设计-期末作业-毕设程序代做 【免费赠送源码】Springboot漫画网站j846u计算机毕业设计-课程设计-期末作业-毕设程序代做本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1…