c++的类的特殊函数实在让人又爱又恨,构造函数,拷贝函数,移动构造,赋值函数,重载运算符等等…
在给与我们很大操作空间的同时,学习曲线着实有些陡峭了。在此记录一下日常笔记,后续会不断补充类相关的函数,努力吧青年!
参考:
c++的拷贝构造函数被调用的时机
C++的四个默认函数(构造函数,析构函数,拷贝函数,赋值函数)
asrModel(const asrModel& other);
auto asr_model = std::make_shared<asrModel>(*this);
当类对象被用来初始化另一个对象的时候会触发。
参考:c++类中的赋值函数
InferReqWrap& operator=(const InferReqWrap& infer) { //赋值函数
if (this != &infer) {
_request = infer._request;
_id = infer._id;
_callbackQueue = infer._callbackQueue;
}
return *this;
}
主要是为了重写operator=()
函数,在函数中判断对象是否相等,不相等则把类中的成员变量都重新赋值一遍,然后返回类对象的引用。
参考:
C++类operator () 重载和函数对象
void operator()()的含义
void ConnectionHandler::operator()() { }
operator()()的含义:
1、第一个括号代表我要重载运算符()
2、第二个括号代表重载时传入的参数,可以有参数,也可以不传入参数
效果:当实例化类的时候,会自动执行重载()方法中的逻辑。和构造函数的区别如下:
C++里仿函数是什么
(1)首先是定义形式:
构造函数无返回值,而operator是可以有返回值的;
(2)定义时,构造函数需要类名,而重载operator()则不用;
(3)其次是调用形式:构造函数是声明对象,而仿函数则需要声明好的对象进行调用。
仿函数:
仿函数的意思是:它不是函数(其实是个类),但用法和函数一样。既然是个类,就可以存储很多变量和其他的信息,然后实现纯函数实现不了的功能。所以在一些需要函数作为参数的地方可以用仿函数代替。在STL里很多地方用到了仿函数。
参考:c++类模版详解
类模板与函数模板的定义和使用类似,有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,我们可以通过声明模版类的方式,实现多种数据类型的兼容。
子类从模板类继承的时候,需要让编译器知道 父类的数据类型具体是什么
1.父类一般类,子类是模板类, 和普通继承的玩法类似
2.子类是一般类,父类是模板类,继承时必须在子类里实例化父类的类型参数
3.父类和子类都时模板类时,子类的虚拟的类型可以传递到父类中
参考:
C++里面四种智能指针的使用及区别
类指针与智能指针
//调用类的构造函数,返回类对象
C obj1("o1", 11, 111);
obj1.memberFunction1();
//使用new实例化类,返回指针
C *obj2 = new C("O2", 22, 222.0);
obj2->memberFunction1();
ⅰ. 内存空间与生命期不同
二者的类型决定了它们在内存上的分布不同。一个是对象类型,在创建时就已为对象分配好内存空间,用的是内存栈,是个局部的临时变量,作用域在该函数体内,随函数的结束被释放。一个是指针类型,用的是内存堆,是个永久变量,在调用时需要先用new分配动态内存,用完后必须手动delete掉。 如不想手动delete
也可使用智能指针。
ii.调用方式上的不同
对象使用" . “
操作符调用,而指针使用” -> "
操作符调用。
iii.访问和传递的不同
对象可直接访问,但不能实现多态,声明即调用了构造函数(已分配了内存);作为参数时,传递对象会调用拷贝构造函数,复制整个对象空间,参数传递占用资源大。
指针变量是间接访问,但可实现多态(通过父类指针可调用子类对象,以及子对象中重写的父类虚函数),并且没有调用构造函数。
ⅰ. 对象在生命周期结束后会自动盗用析构函数释放内存,类指针需要通过 delete
来调用析构函数进行销毁,那指向的普通数据的指针却不会自动销毁,可能导致C++内存泄漏。
ⅱ. 智能指针在函数结束时会自动释放内存空间,不需要手动释放内存空间,这样就避免了内存泄漏
ⅲ. 智能指针成员函数
成员函数:
use_count 返回引用计数的个数
unique 返回是否是独占所有权( use_count 为 1)
swap 交换两个 shared_ptr 对象(即交换所拥有的对象)
reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少
get 返回内部对象(指针) ---->可以把智能指针转换为类指针
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