文章目录

  • 一、前言
  • 二、正文
    • 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++的构造函数赋值函数重载运算符等相关推荐

  1. 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

    文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...

  2. 友元函数重载+运算符

    #include<iostream> //#include<vector> using namespace std; class Vector {private:int a;i ...

  3. 用成员函数和友元函数重载运算符

    一元运算符 首先明白什么是一元,二元和多元运算符,比如++a.b--属于一元运算符,因为参与运算的参数只有一个,以此类推二元运算符就是参与运算的参数有两个,比如a+b. 一元运算符可以表示为:Obje ...

  4. C++用友元成员函数重载运算符,实现+-的重载使之适用复数计算

    /*用友元成员函数重载运算符,实现+-的重载使之适用复数计算 */ #include<iostream> using namespace std; class complex{ priva ...

  5. java构造函数可以重载么_Java 构造函数和函数重载

    构造函数:⑴方法名和类名相同,而且没有返回类型(包括 void 也没有): ⑵没有返回值: ⑶如果没有输入构造函数,jvm会自动帮我们创建一个不带参数,没有任何函数体的的构造函数: 如果我们手动的创建 ...

  6. 类与对象:类的6个默认成员函数: 构造函数、析构函数、拷贝构造函数、赋值操作符重载、默认拷贝构造与赋值运算符重载的问题、const成员函数、 取地址及const取地址操作符重载

    1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类.任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数. 构造函数 析构函数 拷贝构造函数 赋值操作符重载 const成员函数 ...

  7. C++“拷贝构造函数”和“重载 = 运算符”

    文章目录 一:拷贝构造函数和缺省拷贝构造函数 (一)拷贝构造函数 1.功能介绍 2.定义方法 3.特点 (二)缺省拷贝构造函数 1.功能 2.定义(系统自动生成) 3.特点 (三)"浅&qu ...

  8. C++ 重载运算符和重载函数

    参考:http://www.runoob.com/cplusplus/cpp-overloading.html https://www.cnblogs.com/CaiNiaoZJ/archive/20 ...

  9. C++学习笔记:(二)函数重载 常量与引用

    目录 3.函数重载 3.1 非成员函数重载 3.2 成员函数重载 3.3 函数的默认参数 3.4 内联函数 4.常量与引用 4.1 const的最初动机 4.2 const与指针 4.3 const与 ...

最新文章

  1. WMI Series :事件预订和处理
  2. spring 数组中随机取几个_别给孩子取这三种名字!截止年末,名字中的这几个字已经烂大街了...
  3. 67.数据库系统的三级模式
  4. SQL 2008 R2 启动失败 提示 请求失败或服务未及时响应
  5. [Lintcode]118. Distinct Subsequences/[Leetcode]115. Distinct Subsequences
  6. Unity C#代码小技巧
  7. 链接mysql工具封装_JDBC——java连接MySQL封装处理
  8. 32 Pin和 8 Pin(引脚 )flash烧录操作指导
  9. 树莓派入门(六)之控制舵机、伺服电机的驱动代码
  10. 光猫怎么设置wifi 光猫怎么设置wifi密码
  11. 1000+常用Python库大全,太实用了!
  12. 被举报了,越想越后怕...
  13. 热力地图高德_高德地图
  14. Android8.0 修改默认铃声 添加新铃声
  15. 什么是嵌入式服务器?为什么要使用嵌入式服务器? -- java面试
  16. 鸿蒙子系统解读-分布式任务调度篇
  17. 前端参数无法转为后端实体内部类_javaweb实现自动将前端的属性值(HttpServletRequest)转化为后台对应的实体类...
  18. 不同版本的VS项目复制出现“PDB 格式不兼容;请删除并重新生成”的问题解决方法
  19. 软件测试培训有就业保障吗?
  20. R语言自学笔记-----R绘图(二)---饼图

热门文章

  1. 易基因|综合DNA甲基化测序揭示前列腺癌死亡率的预后表观遗传生物标志物 | 文献速递
  2. linux系统切换输入法,linux系统切换输入法
  3. /usr/bin/ld: cannot find -lxxx的错误
  4. 【k8s】重启kubelet、查看所有服务
  5. BZOJ 4372 烁烁的游戏
  6. 靠谱的HEVC方案-软编解码器
  7. echarts地图导航飞线与层级穿透
  8. 2018年第九届蓝桥杯A组省赛
  9. php俄罗斯方块代码,JavaScript实现俄罗斯方块游戏过程分析及源码分享_javascript技巧...
  10. What Would Warren Do?