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_ptr
 
std::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++,开发语言)