c++的构造函数赋值函数重载运算符等
文章目录
- 一、前言
- 二、正文
- 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
c++的构造函数赋值函数重载运算符等相关推荐
- 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )
文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...
- 友元函数重载+运算符
#include<iostream> //#include<vector> using namespace std; class Vector {private:int a;i ...
- 用成员函数和友元函数重载运算符
一元运算符 首先明白什么是一元,二元和多元运算符,比如++a.b--属于一元运算符,因为参与运算的参数只有一个,以此类推二元运算符就是参与运算的参数有两个,比如a+b. 一元运算符可以表示为:Obje ...
- C++用友元成员函数重载运算符,实现+-的重载使之适用复数计算
/*用友元成员函数重载运算符,实现+-的重载使之适用复数计算 */ #include<iostream> using namespace std; class complex{ priva ...
- java构造函数可以重载么_Java 构造函数和函数重载
构造函数:⑴方法名和类名相同,而且没有返回类型(包括 void 也没有): ⑵没有返回值: ⑶如果没有输入构造函数,jvm会自动帮我们创建一个不带参数,没有任何函数体的的构造函数: 如果我们手动的创建 ...
- 类与对象:类的6个默认成员函数: 构造函数、析构函数、拷贝构造函数、赋值操作符重载、默认拷贝构造与赋值运算符重载的问题、const成员函数、 取地址及const取地址操作符重载
1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类.任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数. 构造函数 析构函数 拷贝构造函数 赋值操作符重载 const成员函数 ...
- C++“拷贝构造函数”和“重载 = 运算符”
文章目录 一:拷贝构造函数和缺省拷贝构造函数 (一)拷贝构造函数 1.功能介绍 2.定义方法 3.特点 (二)缺省拷贝构造函数 1.功能 2.定义(系统自动生成) 3.特点 (三)"浅&qu ...
- C++ 重载运算符和重载函数
参考:http://www.runoob.com/cplusplus/cpp-overloading.html https://www.cnblogs.com/CaiNiaoZJ/archive/20 ...
- C++学习笔记:(二)函数重载 常量与引用
目录 3.函数重载 3.1 非成员函数重载 3.2 成员函数重载 3.3 函数的默认参数 3.4 内联函数 4.常量与引用 4.1 const的最初动机 4.2 const与指针 4.3 const与 ...
最新文章
- WMI Series :事件预订和处理
- spring 数组中随机取几个_别给孩子取这三种名字!截止年末,名字中的这几个字已经烂大街了...
- 67.数据库系统的三级模式
- SQL 2008 R2 启动失败 提示 请求失败或服务未及时响应
- [Lintcode]118. Distinct Subsequences/[Leetcode]115. Distinct Subsequences
- Unity C#代码小技巧
- 链接mysql工具封装_JDBC——java连接MySQL封装处理
- 32 Pin和 8 Pin(引脚 )flash烧录操作指导
- 树莓派入门(六)之控制舵机、伺服电机的驱动代码
- 光猫怎么设置wifi 光猫怎么设置wifi密码
- 1000+常用Python库大全,太实用了!
- 被举报了,越想越后怕...
- 热力地图高德_高德地图
- Android8.0 修改默认铃声 添加新铃声
- 什么是嵌入式服务器?为什么要使用嵌入式服务器? -- java面试
- 鸿蒙子系统解读-分布式任务调度篇
- 前端参数无法转为后端实体内部类_javaweb实现自动将前端的属性值(HttpServletRequest)转化为后台对应的实体类...
- 不同版本的VS项目复制出现“PDB 格式不兼容;请删除并重新生成”的问题解决方法
- 软件测试培训有就业保障吗?
- R语言自学笔记-----R绘图(二)---饼图
热门文章
- 易基因|综合DNA甲基化测序揭示前列腺癌死亡率的预后表观遗传生物标志物 | 文献速递
- linux系统切换输入法,linux系统切换输入法
- /usr/bin/ld: cannot find -lxxx的错误
- 【k8s】重启kubelet、查看所有服务
- BZOJ 4372 烁烁的游戏
- 靠谱的HEVC方案-软编解码器
- echarts地图导航飞线与层级穿透
- 2018年第九届蓝桥杯A组省赛
- php俄罗斯方块代码,JavaScript实现俄罗斯方块游戏过程分析及源码分享_javascript技巧...
- What Would Warren Do?