引用及操作符的重载

原创 2017年07月28日 13:38:44

引用是C++的概念,属于C++编译器对C的一个扩展
引用可以看做是一个已经定义的变量的别名
语法:
Type &b = a;
引用是不能修改的,所以在声明时必须初始化。并且其还占有内存空间。可以简单的理解type * const name
引用的原理我们不需要理解,只要把引用可以看做是一个已经定义的变量的别名

当被调用的函数当左值的时候,函数的返回值必须为引用


引用方面未完待续。


操作符的重载

重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:
1)不改变运算符的优先级
2)不改变运算符的结合性
3)不改变运算符所需要的操作数 
4)不能创建新的运算符

运算符的重载常见的有两种:

1)一元运算符的重载

2) 二元运算符的重载


先来看看一元操作符的重载

社会我浩哥,人狠话不多,也不多说,直接上代码演示:

#include <iostream>
using namespace std;
/*
一元运算符的重载我们从以下方面讲解:
1 全局函数实现操作符重载
 1) 操作区前置
 2) 操作符后置
2 成员函数实现操作符重载
 1) 操作区前置
 2) 操作符后置
*/

class Student {

public :
	Student(int grade,char * name);
	~Student();
	//成员函数之前置
	Student & operator ++ ();
	int grade;
	char * name;
};

Student::Student(int grade, char * name) {
	this->grade = grade;
	this->name = name;
}
Student::~Student() {

}
//成员函数之前置的业务实现
Student & Student::operator ++ () {
	this->grade = this->grade + 1;
	return *this;
}

//全局函数之前置
//注意参数的形式是固定的没如果不折磨写的话会执行类的拷贝构造函数
//为了效率一切都是值得的,因为我们是C++;
Student & operator ++ (Student& s) {
	s.grade = s.grade + 1;
	return s;
}
void main() {
	Student s(99, "魏金浩");
	//前置为先++在使用
	++s;
	cout << s.grade << s.name << endl;
	system("pause");
}
上面代码只对前置实现了,后置的原来也是如此,在这我就不老和尚念经了,太啰嗦。

下面代码演示的是双元运算符的重载:

#include <iostream>
using namespace std;
/*
双元运算符的重载有两种常见的方式
1 全局函数重载
2 成员函数重载

*/
class Student
{
public:
	Student(int grade,char * name);
	~Student();
	//实现操作符重载的成员函数
	Student operator + (Student& s2);
	int grade;
	char * name;

};

Student::Student(int grade, char * name)
{
	this->grade = grade;
	this->name = name;
}

Student::~Student()
{
}

Student Student::operator + (Student& s2) {
	Student s3(this->grade +s2.grade,"new");
	return s3;
}

//实现操作符重载的全局函数
Student operator + (Student& s1, Student& s2) {
	Student s(s1.grade + s2.grade, "new");
	return s;
}


void main() {
	Student s1(96, "魏金浩"), s2(33, "周菲菲");
	Student s3 = s1 + s2;
	/*
	关于书写函数实现操作符重载的步骤
	1 承认操作符重载是一个函数
	2 根据操作数1 操作数2 完成函数参数
	3 根据函数原型实现需要的业务
	*/
	cout << s3.grade << s3.name << endl;
	system("pause");
	
}


好了,基本代码我们都演示清楚了,下面我们来讨论讨论运算符的重载有什么现实意义了:


在讲现实意义前你有必要复习一下我们的上一篇文章,类的构造,拷贝构造,析构一章。


未完待续!!~!


版权声明:本文为博主原创文章,未经博主允许不得转载。

操作符重载之解引用与箭头操作符

箭头操作符与众不同。它可能表现得像二元操作符一样:接受一个对象和一个成员名,对对象解引用以获取成员。不管外表如何,箭头操作符不接受显式形参。这里没有第二个形参,因为 -> 的右操作数不是表达式,相反,...
  • IT_PCode
  • IT_PCode
  • 2015年01月13日 18:02
  • 1330

C++解引用运算符*重载

“*”是一个一元操作符,它作用于指针,表示去除指针所指单元的内容。当某个类中对*操作符今次那个重载时,是将该类的对象当做一个指针看待,而用*操作符提取指针所指向的内容。考察如下程序。#include ...
  • K346K346
  • K346K346
  • 2015年11月22日 00:54
  • 2400

友元 重载<<运算符为什么要返回ostream的引用?

ostream operator
  • lenlendenuan
  • lenlendenuan
  • 2015年03月26日 10:19
  • 374

C++ 重载操作符 operator

参数个数的限定     非成员函数:   单目运算符:参数表中只有一个参数;   双目运算符:参数表中只有两个参数       成员函数:   单目运算符:参数表中没有参数; ...
  • fenhong91
  • fenhong91
  • 2017年02月07日 09:55
  • 1034

C++重载[]数组操作符

#include #include using namespace std; class CharPair{ public: CharPair(){ } CharPair(char f...
  • w397090770
  • w397090770
  • 2012年03月18日 14:46
  • 6364

实现操作符重载的两种方式

操作符重载的实现方式有两种,即通过“友元函数”或者“类成员函数”。 1.友元函数重载操作符的格式: 1 class 类名 2 { 3 friend 返回类型 operator ...
  • u014082714
  • u014082714
  • 2015年03月15日 10:45
  • 874

C++运算符重载(4) - 不能被重载的操作符

C++,中,下面的操作符是不能被重载的: . (成员访问或点操作符) ?: (三元操作符或条件操作符) :: (范围操作符) .* (指向成员的指针操作符) sizeof (取对象大小操作符) typ...
  • shltsh
  • shltsh
  • 2015年05月26日 09:39
  • 2173

关于重载赋值操作符需要返回引用

#include /* 如果赋值操作符不返回引用代码也能编译通过 但会增加调用copy构造函数的开销(因为返回局部对象会调用拷贝构造函数)。 返回引用的话能减少调用copy构造函数 (eff...
  • crazyacm
  • crazyacm
  • 2016年09月21日 21:04
  • 438

C++面向对象操作符重载:调用操作符和函数对象

1、定义了调用操作符的类,其对象常称为函数对象,即它们是行为类似函数的对象。      可以为类类型的对象重载函数调用操作符。一般为表示操作的类重载调用操作符。函数调用操作符必须声明为成员函数。一个...
  • QQrenzai
  • QQrenzai
  • 2015年11月11日 08:58
  • 1099

C++运算符重载,+-*/的重载,返回值为什么是对象而不是对象的引用?而流操作符<< 和 >> 却返回的是引用?

 原因是: +,-,*等返回不了引用,比如+运算符,可以如下重载(为了简单,假设A 只有int x;int y) A operator+(A a,A b) {A sum;   sum...
  • csdnxq
  • csdnxq
  • 2015年05月02日 21:38
  • 1191
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:引用及操作符的重载
举报原因:
原因补充:

(最多只允许输入30个字)