C++运算符重载
2020-04-28 14:04:07 0 举报
AI智能生成
C++运算符
作者其他创作
大纲/内容
运算符
函数调用运算符
名称
operator()()
也叫仿函数
没有固定写法,形参可以自定义,返回值可以自定义
左移运算符
名称
operator<<()
不会利用成员函数重载<<运算符,因为无法实现cout在左侧
全局重载
friend ostream& Person operator<<(ostrema &out,Person&p)
左移运算符配合友元可以输出自定义的类型
赋值运算符
名称
Person& operator=()
返回引用
利用深拷贝替换浅拷贝问题
关系运算符
名称
bool operator==(Person&p,Person&p1)
递增运算符
名称
operator++()
可以全局,可以成员函数
前置自增
Person & operator++()
返回引用
后置自增
Person operator++(int)
形参int是为了区别前置自增
返回值,不返回引用
加号运算符
名称
operator+()
成员函数重载
Person operator+(Person&p)
全局函数重载
Person operator+(Person&p1,Person &p2)
函数重载
Person operator+(Person&p,int a)
内存模型
代码区
存放函数体的二进制代码,由操作系统管理
共享的
只读的
全局区
存放全局变量和静态变量以及常量
程序结束后操作系统释放
栈区
编译器自动分配释放,存放函数参数,局部变量等
不要返回局部变量的地址,栈区数据由编译器释放
堆区
程序员分配和释放
C++new在堆区开辟内存
模板
函数模板
特点
模板不可以直接使用,他只是一个框架
模板的通用不是万能的
使用方法
自动推导类型
必须推导出一致的数据类型T才可以使用
模板必须确定出T的数据类型,才可以使用
显式调用
普通函数与模板函数区别
普通函数调用可以发送自动类型转换
函数模板调用时
显示指定类型的方式,可以发生隐式类型转换
利用自身自动类型推导,不会发生隐式类型转换
普通模板与函数调用规则
如果函数模板和普通函数都可以实现,优先调用普通函数
可以通过空模板参数列表来强制调用函数模板
函数模板可以发送重载
如果函数模板可以发生更好的匹配,优先调用函数模板
总结:既然提供了函数模板,最好不要提供普通函数,否则容易出现二义性
模板的局限性
特定数据类型,需要用具体化的方式特殊实现
类模板
建立一个通用的类,类中的成员类型可以不具体指定,用一个虚拟的类型来代表
成员函数调用时机
普通函数中成员函数一开始就可以创建
类模板中的成员函数在调用时才创建
类模板对象做函数参数
指定传入类型
参数模板化
整个类模板化
继承
子类继承的父类是一个类模板时,子类在声明的时候,需要指出父类中T的类型
如果不指定,编译器无法给予类分配内存
要想灵活指定出父类中T的类型,子类也需要变为类模板
一般类模板头文件和源文件写在一起,后缀改为.hpp
类模板与函数模板区别
类模板没有自动类型推导的使用方式
类模板在模板参数列表中可以有默认参数
引用
定义
给一个变量取别名
注意事项
引用必须初始化
引用初始化后不可以改变
引用参数传参
简化指针修改实参
引用参数产生的效果同按照地址传递是一样的。引用语法更清楚简单
引用返回值
不要返回局部变量引用
函数调用可以作为左值
引用的本质在C++内部就是一个指针常量
0 条评论
下一页