- 10.1 表准库中string类的重载运算符
- 重载运算符有==,!=,>,<,<=,>=
- 注意:String类中重载的“[ ]”运算符不提供边界检查功能,而标准的string类在其成员函数中at提供了边界检查功能
- 10.2 运算符重载的基础知识
- 注意
- 要在类上使用运算符,必须重载运算符(=、&、,除外)
- 如果重载运算符定义为成员函数,则必须为非static,因为他们必须由该类调用并作用于自身
- 不能被重载的运算符
- . 和 .* 和 :: 和 ?:
- 运算符重载的规则
- 运算符的优先级、结合律、元数不会被改变
- 不能创建新的运算符,只能在现有的运算符基础上重载
- 重载()、[]、->时必须为成员函数
- 重载二元运算符
- class String{public: bool operator<(const String &) const; ....};重载为成员函数,实际效果相当于string1.operator<(string2)
- class String{bool operator<(const String &, const String &);};重载为非成员函数,实际效果相当于operator<(string1, string2)
- 重载二元流插入运算符和流输入运算符
- friend ostream &operator<<(ostream &, const PhoneNumber &);
- friend istream &istream>>(istream &, PhoneNumber &);
- 注意:必须定义为非成员函数,类对象为右值,因为需要访问类中的私有成员数据,因此声明为友元函数friend
- 重载一元运算符
- class String{bool operator!(const String &); public: bool operator!() const;};
- 重载一元前置和后置运算符:++、--
- 前置运算符重置
- 作为成员函数
- Date &operator++();
- 作为非成员函数
- Date &operator++(Date &);
- 作为成员函数
- 后置运算符重置
- 作为成员函数
- Date operator++(int);
- 作为非成员函数
- Date operator++(Date &, int);
- 提示:参数int实际提供的实参是“0”这个哑值,用于区分是前置还是后置。因为后置运算符返回的是对象自增前的副本,因此不作引用
- 作为成员函数
- 前置运算符重置
- 注意
- 10.3 动态内存管理
- 使用new来动态获取内存
- 动态内存的初始化
- Time *timePtr = new Time();//new返回一个指向该新创建对象的指针
- int *gradesArray = new int[10]();//初始化一个内置数组
- 动态分配的数组大小可以是求值表达式,而原本创建的内置数组必须是常量整数
- int *gradesArray = new int[10]{};//使用列表初始化一个内置数组
- 实现列表初始化的声明
- Array::Array(initializar_list<int> list);//首先要包含头文件<initializar_list>
- 实现列表初始化的声明
- 注意:若new无法在内存中为对象找到足够的空间,就会抛出异常
- 动态内存的初始化
- 使用delete动态释放内存
- delete timePtr;
- delete []gradesArray;
- delete内置数组时必须加上[]
- 补充:delete先调用对象的析构函数,在回收其内存
- 注意
- delete只能释放使用new分配的内存
- delete后的指针最好将其设置为nullptr
- 使用new来动态获取内存
- 10.4 类型转换
- 转换运算符(强制类型转换运算符)
- MyClass::operator char *() const;
- 不指定返回类型,并且必须为非static成员函数,因为其返回类型正是我们要转换的类型,无法具体确定
- 转换运算符(强制类型转换运算符)
- 10.5 explicit构造函数与转换运算符
- explicit的构造函数必须是单个参数
- 声明为explicit的构造函数不可以被隐式构造
10 chapter 运算符重载:string类(cpp大学教程)学习笔记
最新推荐文章于 2022-07-17 10:51:54 发布