引用是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");
}
在讲现实意义前你有必要复习一下我们的上一篇文章,类的构造,拷贝构造,析构一章。
未完待续!!~!