C++ Primer笔记13_运算符重载_总结

总结:

1.不能重载的运算符: . 和 .* 和 ?: 和 ::  和 sizeof 和 typeid

2.重载运算符有两种基本选择: 类的成员函数或者友元函数, 建议规则如下:


运算符


建议使用


所有一元运算符


成员函数


= () [] ->


必须是成员函数


+= -= /= *= ^= &= != %= >>= <<= , 似乎带等号的都在这里了.


成员函数


所有其它二元运算符, 例如: –,+,*,/


友元函数

3.前几篇中的实例,现在汇总Person类的程序:

#include <iostream>
#include <new>
#include <string>

using namespace std;

class Person
{
public:
	Person();
	Person(int n, const string &str);
	Person(const Person &n);
	Person &operator=(const Person &p);
	~Person();

	string getName()const;
	friend ostream &operator<<(ostream &out, const Person &p);
	friend istream &operator>>(istream &in, Person &p);
	friend Person operator+(const Person &p1, const Person &p2);
	friend bool operator==(const Person &p1, const Person &p2);
	Person & operator++();
	Person & operator--();
	Person & operator++(int);
	Person & operator--(int);
	Person * operator->();
	Person & operator*();
private:
	int age;
	string *name;
};

Person::Person():age(0), name(NULL)
{
	cout << "Default Person" << endl;
}

Person::Person(int n, const string &str):age(n), name(new string(str))
{
	cout << "Init Person" << endl;
}

Person::Person(const Person &n)
{
	if(n.name)
	{
		name = new string(*(n.name));
		age = n.age;
	}
	else
	{
		name = NULL;
		age = 0;
	}
}

Person & Person::operator=(const Person &p)
{
	if(this == &p)
	{
		return *this;
	}
	string *tmp = new string(*p.name);
	delete this->name;
	this->name = tmp;
	this->age = p.age;

	cout << "operator =" << endl;

	return *this;
}

Person::~Person()
{
	cout << "~Person " << "name: " << name << " age: " << age << endl;
	delete name;
}

string Person::getName()const
{
	if(name)
	{
		return *name;
	}
	return string();
}

ostream &operator<<(ostream &out, const Person &p)
{
	out << "p.age: " << p.age << ", p.name: " << p.getName();
	return out;
}

istream &operator>>(istream &in, Person &p)
{
	string s;
	cout << "please input age and name:";
	in >> p.age >> s;
	if(in)
	{
		p.name = new string(s);
	}
	else
	{
		p = Person();
	}

	return in;
}

Person operator+(const Person &p1, const Person &p2)
{
	string s1(*p1.name);
	string s2(*p2.name);
	Person p;
	p.age = p1.age + p2.age;
	p.name = new string(s1+s2);
	return p;
}

bool operator==(const Person &p1, const Person &p2)
{
	if(p1.age == p2.age && p1.name == p2.name)
	{
		return true;
	}
	return false;
}

Person & Person::operator++()
{
	age++;//only ++ age
	return *this;
}

Person & Person::operator--()
{
	age--;
	return *this;
}

Person & Person::operator++(int)
{
	Person &p = *this;
	age++;
	return p;
}

Person & Person::operator--(int)
{
	Person &p = *this;
	age--;
	return p;
}

Person * Person::operator->()
{
	return this;
}

Person & Person::operator*()
{
	return *this;
}

int main()
{
	Person p1(20, "SCOTT");
	Person p2(10, "Kate");

	cout << p1->getName() << endl;
	cout << (*p2).getName() << endl;

	return 0;
}

到此,运算符重载先告一段落,以后还会继续探究更深层次的问题。

C++ Primer笔记13_运算符重载_总结,布布扣,bubuko.com

时间: 2024-10-20 11:05:15

C++ Primer笔记13_运算符重载_总结的相关文章

C++ Primer笔记12_运算符重载_递增递减运算符_成员访问运算符

1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.但是因为他们改变的正好是所操作对象的状态,所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本,因此,我们应该为类定义两个版本的递增与递减运算符. 问题来了,程序是如何区分前置和后置呢?因为都是++和-- 为了解决这个问题,后置版本的递增递减运算符接受一个额外的(不被使用)int类型的形参.当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参.这个形参唯一的作用就是区分前置和后置运算符函数. 因为不会

C++ Primer笔记10_运算符重载_赋值运算符_输入/输出运算符

我们致力于推广Scriptcase,以产品销售.技术支持.培训服务.外包开发为核心,将Scriptcase这一简单易用的工具真正在国内予以推广.我们搭建了Scriptcase的示例网站,通过该网站可以看到在几乎不需要任何编程的情况下,Scriptcase可以做到如何快速和先进的开发. 敬请访问 www.phpscriptcase.com C++ Primer笔记10_运算符重载_赋值运算符_输入/输出运算符

C++ Primer笔记10_运算符重载_赋值运算符_进入/输出操作符

1.颂值运营商 首先来福值运算符引入后面要说的运算符重载.上一节说了构造函数.拷贝构造函数:一个类要想进行更好的控制.须要定义自己的构造函数.拷贝构造函数.析构函数.当然,还有赋值运算符.常说的三大函数就是指拷贝.赋值.析构. 假设一个类不定义自己的赋值运算符.会自己生成一个默认的赋值运算操作.这个默认的赋值运算满足一般类的需求.它实现的是一个浅拷贝.可是当类的功能.作用逐渐完好时,就会出现非常多问题.所以,通过自己定义赋值运算符来控制赋值操作时类的行为是非常有必要的.当一个类的对象与对象之间发

C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符

1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.可是由于他们改变的正好是所操作对象的状态.所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本号,因此.我们应该为类定义两个版本号的递增与递减运算符. 问题来了.程序是怎样区分前置和后置呢?由于都是++和-- 为了解决问题,后置版本号的递增递减运算符接受一个额外的(不被使用)int类型的形參.当我们使用后置运算符时,编译器为这个形參提供一个值为0的实參. 这个形參唯一的作用就是区分前置和后置运算符函数. 由于

C++ Primer笔记11_运算符重载_算术/关系运算符_下标运算符

3.算法综合实践——搜索引擎 上网搜索有关“搜索引擎”的相关资料,包括但不限于以下方面(至少要有2个方面):搜索引擎岗位要求.搜索引擎工作原理.搜索引 擎涉及到教材中哪些算法.搜索引擎的盈利模式.搜索引擎源码链接.国内外搜索引擎公司现状等. <1>搜索引擎指自动从因特网搜集信息,经过一定整理以后,提供给用户进行查询的系统.因特网上的信息浩瀚万千,而且毫无秩序,所有的信息像汪洋上的一个个小岛,网页链接是这些小岛之间纵横交错的桥梁,而搜索引擎,则为用户绘制一幅一目了然的信息地图,供用户随时查阅.

C++ Primer Plus学习笔记之运算符重载

C++ Primer Plus学习笔记之运算符重载 1,成员函数和友元函数选择的建议 下面我们先看两个例子: 成员函数重载 #include<iostream> using namespace std; class Complex { public: Complex(double r=0,double i=0) { re=r; im=i; } Complex operator+(const Complex& obj); Complex operator!(); void Display

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

C++ Primer笔记3_默认实参_类初探_名字查找与类的作用域

1.默认函数实参 在C++中,可以为参数指定默认值,C语言是不支持默认参数的,Java也不支持! 默认参数的语法与使用: (1)在函数声明或定义时,直接对参数赋值.这就是默认参数: (2)在函数调用时,省略部分或全部参数.这时可以用默认参数来代替. 注意事项: (1)函数默认值只能赋值一次,或者是在声明中,或者是在定义中,都可以. (2)默认参数定义的顺序为自右到左.即如果一个参数设定了缺省值时,其右边的参数都要有缺省值.比如int f(int a, int b=1,int c=2,int d=

C++学习笔记之运算符重载

一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标(参数列表)不同的函数,目的是在对不同类型的参数执行相同的操作时只用一个同名的函数. 运算符重载,就是使同一个运算符在面临不同类型的数据时作出不同的操作(函数重载是操作相同),就是让同一个运算符有多重功能.实际上我们经常用的许多运算符已被重载,例如,将*用于地址,将得到存储在这个地址中的值:但将它用