C++保姆级教程,C++高级教程(收藏级)
2021/6/10 20:24:55
本文主要是介绍C++保姆级教程,C++高级教程(收藏级),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、前言
这套C++教程能够很好的帮助你入门,让你掌握C++基础并且打开通向高级C++工程师的大门,通俗易懂深入浅出是这套教程最大的特点,让你能够很轻松地学习C++,还有更多详细进阶教程等你!
二、前面的相关教程
1.https://www.jianshu.com/p/8daec4f04d05
2.https://www.jianshu.com/p/f0b1f52abf77
3.https://www.jianshu.com/p/06dd41023471
4.https://www.jianshu.com/p/c443b461c9c4
5.https://www.jianshu.com/p/d02ba7ec3f30
6.https://www.jianshu.com/p/f93168dd6e2f
7.更多详细进阶教程也可以关注微信公众号 “C和C加加” 回复“ZXC”即可获取
三、运算符重载
所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。
运算符重载是通过函数实现的,它本质上是函数重载。
允许重载的运算符
不允许重载的运算符
1.定义
重载运算符遵循的规则:
不可以自己定义新的运算符,只能对已有的C++运算符重载。
不能改变运算符运算对象的个数。
不能改变运算符的优先级和结合性
应与标准类型运算功能相似,避免影响可读性。
一般格式:
函数类型 operator运算符(参数列表) { 函数体 } //举个栗子:定义一个向量类,通过运算符重载,可以用+进行运算。 class Vector3 { public: Vector3(); Vector3(double x,double y,double z); public: Vector3 operator+(const Vector3 &A)const; void display()const; private: double m_x; double m_y; double m_z; }; Vector3::Vector3() :m_x(0.0), m_y(0.0), m_z(0.0) {} Vector3::Vector3(double x, double y,double z) : m_x(x), m_y(y), m_z(z) {} //运算符重载 Vector3 Vector3::operator+(const Vector3 &A) const { Vector3 B; B.m_x = this->m_x + A.m_x; B.m_y = this->m_y + A.m_y; B.m_z = this->m_z + A.m_z; return B; } void Vector3::display()const { cout<<"(" << m_x << "," << m_y << "," << m_z << ")" << endl; }
2.形式
运算符重载的形式有两种:重载函数作为类的成员,重载函数作为类的友元函数
根据运算符操作数的不同:双目运算符作为类成员函数,单目运算符作为类的成员函数,双目运算符作为类的友员函数,单目运算符作为类的友元函数。
双目运算符作为友元函数时需要制定两个参数。
运算符重载函数作为类成员函数可以显式调用。
class Vector3 { public: Vector3(); Vector3(double x,double y,double z); public: Vector3 operator+(const Vector3 &A)const; Vector3 operator++(); friend Vector3 operator-(const Vector3 &v1, const Vector3 &v2); friend Vector3 operator--(Vector3 &v); void display()const; private: double m_x; double m_y; double m_z; }; Vector3::Vector3() :m_x(0.0), m_y(0.0), m_z(0.0) {} Vector3::Vector3(double x, double y,double z) : m_x(x), m_y(y), m_z(z) {} //运算符重载 Vector3 Vector3::operator+(const Vector3 &A) const { Vector3 B; B.m_x = this->m_x + A.m_x; B.m_y = this->m_y + A.m_y; B.m_z = this->m_z + A.m_z; return B; } Vector3 Vector3::operator++() { this->m_x ++; this->m_y ++; this->m_z ++; return *this; } void Vector3::display()const { cout<<"(" << m_x << "," << m_y << "," << m_z << ")" << endl; } Vector3 operator-(const Vector3 &v1,const Vector3 &v2) { Vector3 B(v1.m_x - v2.m_x, v1.m_y - v2.m_y, v1.m_z - v2.m_z); return B; } Vector3 operator--( Vector3 &v) { v.m_x--; v.m_y--; v.m_z --; return v; } int main() { Vector3 v1(1, 2, 3); Vector3 v2(2, 3, 2); ++v1;//v1.operator++(); 作为类成员函数可以显式调用 v1.display(); --v2; v2.display(); Vector3 v3 = v1 + v2;// v1.operator+(v2);作为类成员函数可以显式调用 v3.display(); Vector3 v4 = v1 - v2; v4.display(); return 0; }
3.常用运算符的重载
1)自增自减:
//前置运算符 ++a --a operator++() operator--() operator++(Vector3 &v) operator--(Vector3 &v) //后置运算符 a-- a++ operator++(int) operator--(int) operator++(Vector3 &v,int) operator--(Vector3 &v,int)
2)赋值运算符:
String& String::operator=(String &s) { if(this!=&s) { delete[] str; int length = strlen(s.str); str = new char[length+1]; strcpy(str,s.str); } return (*this) }
3)输入\输出运算符重载
friend ostream &operator<<( ostream &output, const Vector3 &v ) { output << "F : " <<v.m_x<< " I : " << v.m_y<<v.m_z; return output; } friend istream &operator>>( istream &input, Vector3 &v ) { input >> v.m_x>> v.m_y>>v.m_z; return input; }
4.实现类型转换
不指定函数类型和参数,返回值的类型由类型名来确定。
类型转换函数只能作为成员函数,不能作为友元函数。
类型转换函数的一般形式:
operator 类型名() { 转换语句; } class Vector3 { public: Vector3(); Vector3(double x,double y,double z); public: Vector3 operator+(const Vector3 &A)const; Vector3 operator++(); friend Vector3 operator-(const Vector3 &v1, const Vector3 &v2); friend Vector3 operator--(Vector3 &v,int); operator double() { return m_x + m_y + m_z; } void display()const; private: double m_x; double m_y; double m_z; }; int main() { Vector3 v1(1, 2, 3); double d = v1; cout << d << endl;//6 return 0; }
5.更多进阶教程可以关注微信公众号 “C和C加加” 回复“ZXC”即可获取
未完待续~~~~
这篇关于C++保姆级教程,C++高级教程(收藏级)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15在使用平台私钥进行解密时提示 "私钥解密失败" 错误信息是什么原因?-icode9专业技术文章分享
- 2024-11-15Layui框架有哪些方式引入?-icode9专业技术文章分享
- 2024-11-15Layui框架中有哪些减少对全局环境的污染方法?-icode9专业技术文章分享
- 2024-11-15laydate怎么关闭自动的日期格式校验功能?-icode9专业技术文章分享
- 2024-11-15laydate怎么取消初始日期校验?-icode9专业技术文章分享
- 2024-11-15SendGrid 的邮件发送时,怎么设置回复邮箱?-icode9专业技术文章分享
- 2024-11-15使用 SendGrid API 发送邮件后获取到唯一的请求 ID?-icode9专业技术文章分享
- 2024-11-15mailgun 发送邮件 tags标签最多有多少个?-icode9专业技术文章分享
- 2024-11-15mailgun 发送邮件 怎么批量发送给多个人?-icode9专业技术文章分享
- 2024-11-15如何搭建web开发环境并实现 web项目在浏览器中访问?-icode9专业技术文章分享