个人网站建设背景和目的,手机软件app开发,wordpress nginx版本,个人介绍网站模板目录 赋值运算符重载 运算符重载
赋值运算符重载#xff08;赋值重载operator#xff09;
前置和后置重载 赋值运算符重载 运算符重载 C为了增强代码的可读性引入了运算符重载 #xff0c; 运算符重载是具有特殊函数名的函数 #xff0c;也具有其返回值类型#xff0c… 目录 赋值运算符重载 运算符重载
赋值运算符重载赋值重载operator
前置和后置重载 赋值运算符重载 运算符重载 C为了增强代码的可读性引入了运算符重载 运算符重载是具有特殊函数名的函数 也具有其返回值类型函数名字以及参数列表其返回值类型与参数列表与普通的函数类似。 函数名字为关键字 operator 后面接需要重载的运算符符号 。 函数原型 返回值类型 operator 操作符 ( 参数列表 ) 注意 不能通过连接其他符号来创建新的操作符比如operator 重载操作符必须有一个类类型参数 用于内置类型的运算符其含义不能改变例如内置的整型 不 能改变其含义 作为类成员函数重载时其形参看起来比操作数数目少1 因为成员函数的第一个参数为隐 藏的 this指针。 .* :: sizeof ?: . 注意以上 5 个运算符不能重载。这个经常在笔试选择题中出现 // 全局的operator
class Date
{
public:Date(int year 1900, int month 1, int day 1){_year year;_month month;_day day;}
//private:int _year;int _month;int _day;
};
// 这里会发现运算符重载成全局的就需要成员变量是公有的那么问题来了封装性如何保证
// 这里其实可以用我们后面学习的友元解决或者干脆重载成成员函数。
bool operator(const Date d1, const Date d2)
{return d1._year d2._year d1._month d2._month d1._day d2._day;
}
void Test ()
{Date d1(2018, 9, 26);Date d2(2018, 9, 27);cout(d1 d2)endl;
} class Date
{
public:Date(int year 1900, int month 1, int day 1){_year year;_month month;_day day;}// bool operator(Date* this, const Date d2)// 这里需要注意的是左操作数是this指向调用函数的对象bool operator(const Date d2){return _year d2._year; _month d2._month _day d2._day;}
private:int _year;int _month;int _day;
}; 赋值运算符重载赋值重载operator 1. 赋值运算符重载格式 参数类型const T 传递引用可以提高传参效率 返回值类型T 返回引用可以提高返回的效率有返回值目的是为了支持连续赋值 检测是否自己给自己赋值 返回*this 要复合连续赋值的含义 class Date
{
public :
//构造函数Date(int year 1900, int month 1, int day 1){_year year;_month month;_day day;}//拷贝构造函数Date (const Date d){_year d._year;_month d._month;_day d._day;}//赋值重载函数Date operator(const Date d)//引用{if(this ! d)//取地址判断是否是自己给自己赋值{_year d._year;_month d._month;_day d._day;}return *this;}private:int _year ;int _month ;int _day ;
}; 2. 赋值运算符只能重载成类的成员函数不能重载成全局函数 class Date
{
public:Date(int year 1900, int month 1, int day 1){_year year;_month month;_day day;}int _year;int _month;int _day;
};
// 赋值运算符重载成全局函数注意重载成全局函数时没有this指针了需要给两个参数
Date operator(Date left, const Date right)
{if (left ! right){left._year right._year;left._month right._month;left._day right._day;}return left;
}
// 编译失败
// error C2801: “operator ”必须是非静态成员 原因赋值运算符如果不显式实现(写出来)编译器会生成一个默认的。此时用户再在类外自己实现 一个全局的赋值运算符重载就和编译器在类中生成的默认赋值运算符重载冲突了故 赋值运算符重载只能是类的成员函数。 3. 用户没有显式实现时编译器会生成一个默认赋值运算符重载以值的方式逐字节拷贝。浅拷贝 注意内置类型成员变量int ,char是直接赋值的而自定义类型成员变量需要调用对应类的赋值运算符 重载完成赋值。 class Time
{
public:Time(){_hour 1;_minute 1;_second 1;}Time operator(const Time t){if (this ! t){_hour t._hour;_minute t._minute;_second t._second;}return *this;}
private:int _hour;int _minute;int _second;
};class Date
{
private:// 基本类型(内置类型)int _year 1970;int _month 1;int _day 1;// 自定义类型Time _t;
};int main()
{Date d1;Date d2;d1 d2;return 0;
} 既然编译器生成的默认赋值运算符重载函数已经可以完成字节序的值拷贝了 还需要自己实 现吗当然像日期类这样的类是没必要的。 注意 如果类中未涉及到资源管理赋值运算符是否实现都可以一旦涉及到资源管理则必 须要实现。 前置和后置重载 class Date
{
public:Date(int year 1900, int month 1, int day 1){_year year;_month month;_day day;}// 前置返回1之后的结果// 注意this指向的对象函数结束后不会销毁故以引用方式返回提高效率Date operator(){_day 1;return *this;}// 后置// 前置和后置都是一元运算符为了让前置与后置形成能正确重载// C规定后置重载时多增加一个int类型的参数但调用函数时该参数不用传递编译器自动传递// 注意后置是先使用后1因此需要返回1之前的旧值故需在实现时需要先将this保存一份然后给this1//而temp是临时对象因此只能以值的方式返回不能返回引用Date operator(int){Date temp(*this);_day 1;return temp;}
private:int _year;int _month;int _day;
};int main()
{Date d;Date d1(2022, 1, 13);d d1; // d: 2022,1,13 d1:2022,1,14d d1; // d: 2022,1,15 d1:2022,1,15return 0;
} 这个博客如果对你有帮助给博主一个免费的点赞就是最大的帮助❤ 欢迎各位点赞收藏和关注哦❤ 如果有疑问或有不同见解欢迎在评论区留言哦❤ 后续我会一直分享双一流211西北大学软件C数据结构CLinuxMySQL的学习干货以及重要代码的分享