c++知识记录day04
c++知识记录day04
一、运算符重载
在C++中会把运算符当作函数来对待,所有这些函数可以被重载,这样可以对类型对象进行定制操作。
如果:string 它就支持很多运行符来代替标准库中的函数,= strcpy, == strcmp, += strcat
A a,b; 当对象执行+运行符时:a + b; 成员函数: const A& operator+(A& b); 全局函数: const A& operator+(A& a,A& b);
二、双目录运算符的重载
双目录运算符的运算结果是个临时对象,返回值应该加 const。
成员函数:
const 类 operator#(const 类& that) const
{
return 类(参数#参数);
}
全局函数: const 类 operator#(const 类& a,const 类& b) { return 类(参数#参数); } 注意:全局函数可能会访问类的私有成员,解决这种问题可以把函数声明为类的友元函数(友元不是成员)。 友元:在类的外部某个函数中想访问类的私有成员时,需要所在的函数声明为友元,但友元只是朋友,因此它只有访问权,没有实际的拥有权(其根本原因是它没 this 指针)。 友元声明:把函数的声明写一份到类中,然后在声明前加上 friend 关键字,使用友元既可把操作符函数定义为全局的,也可以确保类的封装性。。 注意:友元函数与成员函数不会构成重载关系,因为它们不在同一个作用域内。
三、赋值类型的双目操作符
成员函数
类& operator#(const 类& that)
{
} 全局函数 类& operator#(cosnt 类& a,const 类& b) { } 1、获取单参构造成赋值运算的调用方式。 String str = "sunll"; // 会调用单参构造,而不调用赋值运算符 str = "hehe"; 2、左操作数据不能具有 const 属性 1、成员函数不能是常函数 2、全局函数第一个参数不能有 const 属性
四、输入输出操作符重载
cout 是 ostream 类型的对象,cin 是 istream 类型的对象。
如果<</>>运算实现为成员函数,那么调用者应该是ostream/istream,而我们无权增加标准库的代码,因此输人/输出运算符只能定义为全局函数。
ostream& operator<<(ostream& os,const 类& p) { } istream& operator>>(istream& is,类& p) { } 注意:在输入输出过程中,cin/cout会记录错误标志,因此不能加 const 属性。
五、单目操作符函数重载
成员函数
const 类 operator#(void) const
{
} 全局函数 const 类 operator#(const 类& that) { } 前++/-- 类& operator#(void) { } 类& operator#(类& that) { } 后++/--(哑元) const 类& operator#(int) { } const 类& operator#(类& that,int) { }
六、特殊操作符的重载
1、下标操作符[],常用于在容器类型中以下标方式获取元素。
类型& operator[](int i)
{
} 2、函数操作符(),一个类如果重载函数操作符,那么它的对象就可以像函数一个使用,参数的个数、返回值类,可以不确定,它是唯一一个可以参数有缺省参数的操作符。 3、解引用操作符*、成员访问操作符-> 如果一个类重载了*和->,那么它的对象就可以像指针一样使用。 所谓的智能指针就一种类对象,它支持解引用和成员访问操作符。 4、智能指针 常规指针的缺点: 当一个常规指针离开它的作用域时,只有该指针所占用的空间会被释放,而它指向的内存空间能否被释放就不一定了,在一些特殊情况(人为、业务逻辑特殊)free或delete没有执行,就会形成内存泄漏。 智能指针的优点: 智能指针是一个封装了常规指针的类类型对象,当它离开作用域时,它的析构函数会自动执行,它的析构函数会负责释放常规指针所指向的动态内存(以正确方式创建的智能指针,它的析构函数才会正确执行)。 智能指针和常规指针的相同点:都支持*和->运算。 智能指针和常规指针的不同占: 任何时候,一个对象只能使用一个智能指针来指向,而常规指针可以指向多次。 智能指针的赋值操作需要经过拷贝构造和赋值构造特殊处理(深拷贝)。 auto_ptr:标准库中封装好的智能指针,实现了常规指针的基本功能 头文件 #include <memory> 用法:auto_ptr<指向的类型> 指针变量名(对象的地址) auto_ptr的局限性: 不能跨作用域使用,一旦离开作用域指针变量会释放它指向的对象也会释放。 不能放入标准容器。 5、new/delete/new[]/delete[]运算符重载 1、C++缺省的堆内存管理器速度较慢,重载 new/delete 底层使用malloc/free可以提高运行速度。 2、new在失败会产生异常,而每次使用new时为了安全都应该进行异常捕获,而重载new操作符只需要在操作符函数中进行一次错误处理即可。 3、一些占字节数据比较小的类,频繁使用new,可能会产生大量的内存碎片,而重载new操作后,可以适当的扩大每次申请的字节,减少内存碎片产生的机率。 4、重载 new/delete 可以记录堆内存使用的信息 5、重载 delete 可以检查到释放内存失败时的信息,检查到内存泄漏。
七、重载操作符的限制
1、不能重载的操作符
堆限定符 ::
直接成员访问操作符 .
三目操作符 ?:
字节长度操作符 sizeof
类型信息操作符 typeid
2、重载操作符不能修改操作符的优先级
3、无法重载所有基本类型的操作符运算
4、不能修改操作的参数个数
5、不能发明新的操作符
关于操作符重载的建议:
1、在重载操作符时要根据操作符实际的功能和意义来确定具体参数,返回值,是否具有 const 属性,返回值是否是引用或者是临时对象。
2、重载操作符要符合情理(要有意义),要以实际用途为前提前。
3、重载操作符的意义是为了让对象的操作更简单、方便,提高代码的可读性,而不是为了炫技。
4、重载操作符要与默认的操作符的功能、运算规则一致,不要出反人类的操作。
- C++多态原理和虚函数的知识后记录
- C/C++基础知识04---难点记录
- C/C++小知识记录
- (C++练习)细节知识记录
- 初学C++基本知识记录
- C/C++ 新学知识记录
- C++ primer plus 阅读记录-基础知识
- C/C++语法知识:typedef struct 用法详解
- c++知识要点
- C++ 面向对象程序设计 知识笔记(三)
- C++ 一句话知识
- C++ 学习记录 20180301
- 【C++】基础知识—内联(置)函数及register关键字
- C++ 基础知识
- C++基础知识2
- Open CV学习记录(二十二)—图像处理基本知识
- 集合和泛型知识记录
- c++基本知识(1)
- C++基于OpenCV实现实时监控和运动检测记录
- C++ 参数传递,定义与声明,命名空间等基本知识