一、插入析取运算符的重载
1.为cout和cin重载
例子:
#include<iostream>
using namespace std;
class Distance
{
public:
Distance():feet(0),inches(0.0) { }
Distance(int ft,float in):feet(ft),inches(in) { }
friend istream& operator >> (istream& s,Distance& d);
friend ostream& operator << (ostream& s,Distance& d);
private:
int feet;
float inches;
};
istream& operator >> (istream& s,Distance& d)
{
cout<<"Enter the feet: "; s>>d.feet;
cout<<"Enter the inches: "; s>>d.inches;
return s;
}
ostream& operator << (ostream& s,Distance& d)
{
s<<d.feet<<"\'-"<<d.inches<<"\"";
return s;
}
int main()
{
Distance dist1,dist2;
Distance dist3(11,3.22);
cout<<"Enter two Distance values: "<<endl;
cin>>dist1>>dist2;
cout<<"dist1= "<<dist1<<endl
<<"dist2= "<<dist2<<endl;
cout<<"dist3= "<<dist3<<endl;
return 0;
}
通过上面的运算符重载,上面的程序对象就像基本类型一样,既好看又自然。
① 他们返回是istream和ostream的对象的引用,这个返回值允许组成链。
② 运算符的两个参数,都是通过引用来传递。第一个参数流对象,第二个参数类对象。注意这里要用到友元函数。
2.为文件重载这两个运算符
#include<iostream>
#include <fstream>
using namespace std;
class Distance
{
public:
Distance():feet(0),inches(0.0) { }
Distance(int ft,float in):feet(ft),inches(in) { }
friend istream& operator >> (istream& s,Distance& d);
friend ostream& operator << (ostream& s,Distance& d);
private:
int feet;
float inches;
};
istream& operator >> (istream& s,Distance& d)
{
char ch;
s>>d.feet>>ch>>ch>>d.inches>>ch;
return s;
}
ostream& operator << (ostream& s,Distance& d)
{
s<<d.feet<<"\'-"<<d.inches<<"\"";
return s;
}
int main()
{
char ch;
Distance dist1;
ofstream ofile;
ofile.open("dist.dat");
do
{
cout<<"Enter the distance: ";
cin>>dist1;
ofile<<dist1;
cout<<"是否继续?";
cin>>ch;
} while (ch=='y');
ofile.close();
ifstream ifile;
ifile.open("dist.dat");
while(true)
{
ifile>>dist1;
if(ifile.eof())
break;
cout<<"distance= "<<dist1<<endl;
}
return 0;
}
二、内存作为流对象
可以把内存中的一段作为流对象对待,在中间插入数据如同对文件进行操作一样。
向内存中输出数据时,使用类ostrstream,从内存中输入数据的时候使用类istrstream,如果内存对象就有输入又有输出,可以使用由类iostream派生的类strstream。
创建ostrstream对象,使用内存缓冲区及其大小作为参数传递给流的构造函数。
例子:
#include<iostream>
#include<strstream>
#include<iomanip>
using namespace std;
const int SIZE=80;
int main()
{
//定义一些数据
char ch='x';
int j=77;
double d=2342.234;
char str1[]="aldjfa";
char str2[]="asdlfj";
//定义内存缓冲区
char membuff[SIZE];
//使用内存缓冲区及其大小作为参数传送给流的构造函数
ostrstream omem(membuff,SIZE);
//插入数据
omem<<"ch="<<ch<<endl
<<"j="<<j<<endl
<<setiosflags(ios::fixed)
<<setprecision(2)
<<"d="<<d<<endl
<<"str1="<<str1<<endl
<<"str2="<<str2<<endl
<<ends;
cout<<membuff;
return 0;
}
三、命令提示行程序
下面来简单的看下main函数的两个参数的应用:
int main(int argc,char* argv[]) 其中第一个参数指命令提示行的参数数量(包括执行文件名);第二个参数指储存每个参数的储存数组
实例:
#include<iostream>
#include<fstream>
using namespace std;
int main(int argc,char* argv[])
{
char ch;
if (argc!=3)
{
cerr<<"参数输入错误"<<endl
<<"用法:ccopy 参数1 参数2"<<endl
<<"参数1:被拷贝的原函数 参数2:要拷贝到的目的函数"<<endl;
exit(-1);
}
ifstream infile;
infile.open(argv[1],ios::binary);
if (!infile)
{
cerr<<"参数1打开失败";
exit(-1);
}
ofstream outfile;
outfile.open(argv[2],ios::binary);
if (!outfile)
{
cerr<<"参数2打开失败";
exit(-1);
}
while(infile)
{
infile.get(ch);
outfile.put(ch);
}
return 0;
}
上面的程序,编译生成可执行文件ccpoy.exe
如在命令提示行下输入: ccopy.exe a.txt b.txt 就会把文件a中的东西复制到b中。上面的程序连图片也可以完美复制。