您的位置:首页 > 编程语言 > C语言/C++

c++运算符重载

2018-03-27 00:18 309 查看
学习运算符重载时,练习了一个<<运算符的重载,经历了以下过程:

1.

User.h

#include <iostream>
using namespace std;
class User
{
public:
User(int age,char * name);
~User();
char name[40];
int age;
void operator<<(ostream & os);
private:
};
User.cpp

include "User.h"
#include <iostream>
#include <string.h>
using namespace std;

User::User(int age, char * name) {
this->age = age;
strcpy_s(this->name, name);
}

void User::operator<<(ostream & os){
os << "年龄" << this->age << endl << "姓名" << this->name << endl;
}

User::~User()
{
cout << "删除User对象";
}
#include "string"
#include "User.h"

int main()
{
using namespace std;
int age = 22;
char name[] = "张三";
User user1 = { age,name };
User user2(age, name);
User user3 = User(age, name);
User * user4 = new User(age, name);
user1 << cout;
return 0;
}
此时重载函数为成员函数且返回void,可以看到使用运算符时,必须将类对象放到运算符<<的左边,看起来不合适
这是因为c++运算符重载时,操作数的顺序与重载函数参数顺序是相同的,而重载函数第一个参数为隐式参数,即类对象,所以对象必须在运算符左边

这也是重载函数为成员函数的限制,第一个参数为隐式类对象------->类对象必须在运算符左边

2.为了使类对象在运算符右边时可以使用,需要让重载函数参数遵循指定的顺序,则此时重载函数必须为非成员函数:

User.h

#include <iostream>
using namespace std;
class User
{
public:
User(int age,char * name);
~User();
char name[40];
int age;
private:
};
void  operator<<(ostream & os,User & user);
User.cpp

#include "User.h"
#include <iostream>
#include <string.h>
using namespace std;

User::User(int age, char * name) {
this->age = age;
strcpy_s(this->name, name);
}

void operator<<(ostream & os,User & user){
os << "年龄" << user.age << endl << "姓名" << user.name << endl;
}

User::~User()
{
cout << "删除User对象";
}

此时,重载函数为非成员函数,且第一个参数为流,第二个参数为类对象,此时使用方式比较合适,类对象在操作符<<的右边,cout<<user

但是此时运算符<<无法连续调用,需要修改重载函数返回值

3.为了让运算符可以连续调用,则重载函数必须返回ostream对象

#include <iostream>
using namespace std;
class User
{
public:
User(int age,char * name);
~User();
char name[40];
int age;
private:
};
ostream & operator<<(ostream & os,User & user);
#include "User.h"
#include <iostream>
#include <string.h>
using namespace std;

User::User(int age, char * name) {
this->age = age;
strcpy_s(this->name, name);
}

ostream & operator<<(ostream & os,User & user){
os << "年龄" << user.age << endl << "姓名" << user.name << endl;
return os;
}

User::~User()
{
cout << "删除User对象";
}
#include "string"
#include "User.h"

int main()
{
using namespace std;
int age = 22;
char name[] = "张三";
User user1 = { age,name };
User user2(age, name);
User user3 = User(age, name);
User * user4 = new User(age, name);
cout << user1 << user2 << user3 << *user4;
return 0;
}
输出:
年龄22
姓名张三
年龄22
姓名张三
年龄22
姓名张三
年龄22
姓名张三此时,<<运算符可以连续调用

总结,运算符重载的原则:

一、运算符操作数的顺序与重载函数的参数顺序相同(包含隐式参数)---------->类对象在运算符右边时必须使用非成员函数

二、运算符的使用方式本质上就是替换为重载函数-------------->要连续使用必须有返回值,但是就运算符重载本身来说,返回值无所谓

三、编译器会对重载的运算符语义进行检查,所需操作数数量等必须符合语义
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: