泉州做 php 网站,wordpress修改教程视频,网站平台建设哪家公司好,哪个网站可以做淘宝代码前言#xff1a;在前面我们知道在类和对象中有六个默认成员函数#xff0c;并学习了其中三个构造函数、析构函数、拷贝构造函数#xff0c;今天我们将进一步的学习.赋值运算符重载。 #x1f496; 博主CSDN主页:卫卫卫的个人主页 #x1f49e; #x1f449; 专栏分类:高质…前言在前面我们知道在类和对象中有六个默认成员函数并学习了其中三个构造函数、析构函数、拷贝构造函数今天我们将进一步的学习.赋值运算符重载。 博主CSDN主页:卫卫卫的个人主页 专栏分类:高质量学习 代码仓库:卫卫周大胖的学习日记 关注博主和博主一起学习!一起努力 目录标题 运算符重载全局的operator局部的operator显示重载注意事项 运算符重载
运算符重载的概念:C运算符重载是指在C中可以自定义操作符的含义和行为。通过运算符重载可以使用相同的操作符来执行不同类的对象的操作运算符重载是具有特殊函数名的函数也具有其返回值类型函数名字以及参数列表其返回值类型与参数列表与普通的函数类似。
C中可以重载的运算符有
算术运算符、-、*、/、%等关系运算符、!、、、、等逻辑运算符!、、||等位运算符、|、^等赋值运算符、、-等自增自减运算符、–等下标运算符[]函数调用运算符()
要重载一个运算符需要使用运算符关键字operator以及重载函数的名称和参数。重载函数可以作为类的成员函数也可以作为全局函数 函数原型返回值类型 operator操作符(参数列表) 格式如下:
返回类型说明符 operator 运算符符号(参数表)
{函数体}注意
不能通过连接其他符号来创建新的操作符比如operator重载操作符必须有一个类类型参数用于内置类型的运算符其含义不能改变例如内置的整型不能改变其含义作为类成员函数重载时其形参看起来比操作数数目少1因为成员函数的第一个参数为隐藏的this.* :: sizeof ?: . 注意以上5个运算符不能重载。 全局的operator
以下是一个全局重载等于运算符的示例
class Date
{
public:Date(int year 2024, int month 2, int day 1){_year year;_month month;_day day;}void Print(){cout year this-_year month this-_month day this-_day endl;}
public://这里一定得是共有不然外部无法访问int _year;int _month;int _day;
};bool operator(const Date s1,const Date s2)
{return s1._year s2._year s1._month s2._month s1._day s2._day;
}int main()
{Date d1;Date d2(2024, 2, 4);Date d3(d2);if (d1 d2)//判断d1和d2是否相等{cout d1 d2 endl;}else{cout d1 ! d2 endl;}if (d2 d3){cout d2 d3 endl;}else{cout d3 ! d2 endl;}return 0;
}这里作者强调一下重载函数接收参数时候为什么要加上const修饰,因为我们在引用的时候如果不加上const就如下面这个例子一样有的人写代码时候可能没有注意一不小心就把原本的对象的值给修改了所以我们接收参数的时候通常加上const对它进行修饰。
class Date
{
public:Date(int year 2024, int month 2, int day 1){_year year;_month month;_day day;}void Print(){cout year this-_year month this-_month day this-_day endl;}
public://这里一定得是共有不然外部无法访问int _year;int _month;int _day;
};
void operator(Date s1,Date s2)//重载
{s2._year s1._year;
}int main()
{Date d1;Date d2(2024, 2, 4);cout 重载前 endl;cout d1:;d1.Print();cout d2:;d2.Print();d2 d1;cout 重载后 endl;cout d1:;d1.Print();cout d2:;d2.Print();return 0;
}局部的operator
当然了光说不做等于白说以下是一个局部重载等于运算符的示例
#include iostream
#include stdbool.h
using namspace std;
class Date
{
public:Date(int year 2024,int month 2,int day 1)//初始化{_year year;_month month;_day day;}void Print(){cout year this-_year month this-_month day this-_day endl;} bool operator(const Date s1)//在类中成员函数的第一个参数为隐藏的this因此我们只需要一个参数{return _year s1._year _month s1._month _day s1._day;}
private:int _year;int _month;int _day;
};int main()
{Date d1;Date d2(2024, 2, 4);Date d3(d2);if (d1 d2)//判断d1和d2是否相等{cout d1 d2 endl;}else{cout d1 ! d2 endl;}if (d2 d3){cout d2 d3 endl;}else{cout d3 ! d2 endl;}return 0;
}
这里很多人会很疑惑为什么你这里只有一个参数你这一个参数怎么比较两个数是不是相等这里作者来给大家解释一下其实本质上这里有一个隐式的this指针我们在前面也提到过如果不懂什么是this指针的可以去看看博主前面的文章。 别看这里可以赋值但是我们思考一下能不能连续赋值呢
d1 d2 d3;//如果我们要这样赋值呢怎么会出现下面这个情况我们不是赋值了嘛 代码刨析
我们之所以在两个数的时候能够赋值是因为this指针在函数内部就对d2进行了修改。在连续赋值的时候我们该重载函数返回的是void类型相当于我们在对d1赋值的时候是传递了一个void类型的数据过去void类型又怎么可以赋值呢因此我们要想实现连续赋值这里肯定是不能用void作为返回类型。 那么我们又如何解决连续赋值存在的问题呢 3. 在前面我们知道了是返回值的问题那么我们就可以通过对返回值的修改来帮助我们解决 4. 返回什么呢这里我们可以通过返回this*,此时这里的返回值等价于返回了d2这个对象因此可以通过返回引用来解决返回值的问题
class Date
{
public:Date(int year 2024, int month 2, int day 1){_year year;_month month;_day day;}void Print(){cout year this-_year month this-_month day this-_day endl;}Date operator(const Date s1){_year s1._year;_month s1._month;_day s1._day;return *this;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2003,9,22);Date d2(2002,9,26);Date d3(0, 0, 0);cout 重载前 endl;d1.Print();d2.Print();d3.Print();d1 d2 d3;cout 重载后 endl;d1.Print();d2.Print();d3.Print(); return 0;
}显示重载
显示赋值操作符重载:用的比较少这里作者就偷懒提一下
class MyClass {
public:MyClass operator(const MyClass other) {//显示重载// 在这里实现赋值操作return *this;}
};int main() {MyClass obj1;MyClass obj2;obj2 obj1; // 调用赋值操作符重载return 0;
}
注意事项
在C中运算符重载是一种强大的特性它可以让我们自定义类类型的行为使其像内置类型一样使用运算符。然而运算符重载也需要遵循一些注意事项以确保正确和安全地使用。
以下是运算符重载的一些注意事项 只能重载已存在的运算符C只允许重载已存在的运算符而不允许创建新的运算符。例如可以重载, “-”, *“等运算符但不能重载”%%“或”**等新的运算符。 不改变运算符的优先级运算符重载不会改变运算符的优先级和结合性。例如重载运算符不会改变它的加法操作的优先级和结合性。 重载运算符需要至少一个操作数是用户定义的类型为了重载运算符至少需要一个操作数是用户定义的类型自定义类因此重载的运算符不能用于内置类型的操作。 通常情况下重载运算符应该作为类的成员函数通常情况下应该将运算符重载函数声明为类的成员函数。这样可以使其在类的对象上直接调用并享受到类的私有成员的访问权限。然而也可以将运算符重载函数声明为友元函数以便访问类的私有成员。 一些运算符只能重载为成员函数一些运算符例如赋值运算符和下标运算符只能作为类的成员函数进行重载。这是因为它们对操作数的顺序有特定的要求只能将类的对象作为左操作数。 谨慎使用运算符重载运算符重载是一种很强大的特性但也容易被滥用。在重载运算符时要确保其行为符合直觉不会给其他开发者带来困惑。建议只在有必要时才使用运算符重载避免滥用。 重载运算符的返回类型应该符合预期重载运算符的返回类型应该符合预期的语义和行为。例如重载运算符时返回的是左操作数的引用以实现链式赋值的语法。
需要注意的是虽然运算符重载可以更灵活地使用类对象但也需要谨慎使用以避免混淆和错误的行为。在重载运算符时应该遵循一些通用的原则和最佳实践确保代码的可读性、可维护性和安全性。 好啦今天的内容就到这里啦下期内容预告类和对象(四)日期类的实现 结语今天的内容就到这里吧谢谢各位的观看如果有讲的不好的地方也请各位多多指出作者每一条评论都会读的谢谢各位。 ️ 这里祝各位寒假愉快