一、学习要点:
1.类中定义的构造器可以必须在类中声明,但定义可以在类内和类外.
2.插入器和吸取器的构造类型必须输入参数和输出参数都含有对象,这样可以不断保证右插.
3.而且输入输出中都含有流的引用,因为流靠的系统托管,
4.输入的参数为什么也为对象的引用,因为类对象占用内存较大,引用传递时,无需在栈内存中开辟空间以装载临时对象,也省去了复制的耗时过程,为了避免改变形参的内容,还需配以const加以修饰。
5.函数参数为对象引用,可以不用在开辟在栈中开辟空间,也省去了类对象的复制时间,高效,但这样是不安全的,容易改变类对象的值,安全起见,在类对象前面加上const,既保证高效性,有保证安全性.
6.关于流引用的理解,重载输入输出操作符函数,会修改操作你的流,而流是全局的,不是临时变量,是系统托管的。如果不返回引用,第二次插入操作将会导致插入到那个临时的流对象,而显示的会是那个全局的流,所以就看不到b了.
7.一个类的成员函数想访问另一个类的成员变量,这个类的成员函数必须声明为另一个类的友元函数.
二、代码实现
友元函数部分:
声明部分
friend istream& operator>>(istream&,Complex &i);
friend ostream& operator<<(ostream&,Complex &c)
定义部分
istream& operator>>(istream& input,Complex &i){
input>>i.real>>i.image;
return input;
}
ostream& operator<<(ostream& output,Complex &c){
output<<"("<<c.real<<"+"<<c.image<<"i"<<")"<<endl;
return output;
}
可运行版完整代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
class Complex{
public:
Complex():real(0),image(0){};//构造器的函数定义是在类中,使用的是内联函数
Complex(int r,int i):real(r),image(i){};//构造器的函数定义是在类中,使用的是内联函数
Complex(int r):real(r),image(0){};
Complex operator+(Complex &c);
friend istream& operator>>(istream&,Complex &i);//输入输出属于另一个类的成员函数
friend ostream& operator<<(ostream&,Complex &c);
private:
int real;
int image;
};
Complex Complex::operator+(Complex &c){
return Complex(c.real+real,c.image+image);
}
istream& operator>>(istream& input,Complex &i){
cout<<"please input real and image";
input>>i.real>>i.image;//重载未完成之前,>>还是流的输入函数
return input;
}
ostream& operator<<(ostream& output,Complex &c){
output<<"("<<c.real<<"+"<<c.image<<"i"<<")"<<endl;//重载未完成之前,还是流的输出函数
return output;
}
int main(){
Complex c1,c2;
Complex c3(1);
cin>>c1>>c2;
cout<<c1+c2<<endl;
cout<<c3<<endl;
system("pause");
return 0;
}
三、代码运行结果
四、注意事项:
1.C++中一切皆对象,对象引用不仅可以节省时间还有空间,为保证对象的安全,多采用在引用之前加const,变引用双向传递为单向传递.
2.重载主要看函数的输入参数,而决定调用那个函数,像上面的例子,<<中重载函数中又有<<不是递归调用,而重载函数中的<<操作对象发生了变化,调用的不是重载本身,调用的是正常的输入函数.
3.流类是系统托管.