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:
};
这是因为c++运算符重载时,操作数的顺序与重载函数参数顺序是相同的,而重载函数第一个参数为隐式参数,即类对象,所以对象必须在运算符左边
这也是重载函数为成员函数的限制,第一个参数为隐式类对象------->类对象必须在运算符左边
2.为了使类对象在运算符右边时可以使用,需要让重载函数参数遵循指定的顺序,则此时重载函数必须为非成员函数:
此时,重载函数为非成员函数,且第一个参数为流,第二个参数为类对象,此时使用方式比较合适,类对象在操作符<<的右边,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);
年龄22
姓名张三
年龄22
姓名张三
年龄22
姓名张三
年龄22
姓名张三此时,<<运算符可以连续调用
总结,运算符重载的原则:
一、运算符操作数的顺序与重载函数的参数顺序相同(包含隐式参数)---------->类对象在运算符右边时必须使用非成员函数
二、运算符的使用方式本质上就是替换为重载函数-------------->要连续使用必须有返回值,但是就运算符重载本身来说,返回值无所谓
三、编译器会对重载的运算符语义进行检查,所需操作数数量等必须符合语义
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
姓名张三此时,<<运算符可以连续调用
总结,运算符重载的原则:
一、运算符操作数的顺序与重载函数的参数顺序相同(包含隐式参数)---------->类对象在运算符右边时必须使用非成员函数
二、运算符的使用方式本质上就是替换为重载函数-------------->要连续使用必须有返回值,但是就运算符重载本身来说,返回值无所谓
三、编译器会对重载的运算符语义进行检查,所需操作数数量等必须符合语义
相关文章推荐
- C++运算符的重载
- C++运算符重载形式——成员函数or友元函数
- C++运算符重载
- c++运算符重载
- C++运算符重载,友元
- c++运算符重载基础知识详解
- C++运算符的重载研究
- C++运算符重载形式——成员函数or友元函数
- C++运算符的重载
- C++运算符重载讲解与经典实例
- 和C++运算符重载相关的问题
- C++运算符重载 摘自网络
- C++运算符重载(10) - 智能指针
- c++运算符重载
- C++运算符重载以及友元
- C++运算符重载小程序
- C++运算符重载及友元函数-练习题
- C++运算符重载(五)
- 关于c++运算符重载 + 和 ++ 运算符 【2013.10.18】
- C++运算符重载形式——成员函数or友元函数