您的位置:首页 > 编程语言 > C语言/C++

谭浩强C++笔记(13-14章)

2016-03-03 11:17 387 查看
谭浩强C++笔记(13-14章)

第十三章 运算符重载

1.运算符重载函数:可以是成员函数或友元函数,当为单目运算符时,最好为成员函数。为双目运算符时,最好为友元函数,无三个参数情况。基本函数操作都可以重载,.(取类成员) *(取地址值)::(函数作用域)?:(三目运算符)->(地址指针中取成员)除外,重载后,运算符优先级和结合律不能改变,它不能定义为static类型,因为static函数没有this指针。

2.重载函数写法:++前操作A operator++ (A &)(A operator++ ())、 ++后操作A operator++ (A &,int)(A operator++ (int))、对括号()重载A operator()(int a,int b,int c)、将对象变为int类型(此类函数必须是类成员函数,可以cin或cout直接使用,可以为虚函数)opreator int ()、对[]重载operator[](int n)。实现重载,注意返回值,建议新建一个返回的对象,若改变this值时,容易改变成员本身值。

3.输入输出流重载:friend ostream &operator<<(ostream &om,A &a){ofm<<a.x<<a.y<<endl;return om;} friend istream &operator>> (istream &im,A &a){im>>a.x>>a.y;return im;}就可以直接对类对象输入输出。

4.对=号重载:对char数组赋值时,构造函数中若使用new分配了内存空间,要对=重载,以免copy函数调用时,只分配了一块内存空间,析构时析构两次,造成错误。Str &operator= (Str &s){if(sp) delete []sp;if (s.sp) {sp=new char[strlen(s.sp)+1];strcpy(sp,s.sp);}else sp=NULL;return *this;},若返回值为引用,可以连续使用此函数。若自己重写了=操作,要显示实现一下COPY函数。

第十四章 输入/输出流类库

1. #include<fstream.h>

fstream(可以输入输出)、ifstream(只能输入)、ofstream(只能输出)。

示例代码:

void main()

{

//ifstream ifsm("1.txt");ofstream ofsm("2.txt");

ifstream ifsm;ofstream ofsm;

ifsm.open("1.txt");ofsm.open("2.txt");

int i;char ch;char buf[300];

ifsm>>i;ofsm<<i;

//while(ifsm.get(ch))

// ofsm<<ch;

ifsm.getline(buf,300);ofsm<<buf;

ifsm.close();ofsm.close();

}用文件进行输入输出时,和cin 、cout 类似。

2.下面是用fstream进行读和写:

fstream fsm("2.txt",ios::in|ios::out);

for (int i=0;i<10;i++)

fsm<<i;

for(i=0;i<10;i++)

{fsm>>i;cout<<i<<'/t';}

fsm.close();

上例中只能对一个文件进行操作,若要进行两个文件操作,可分别指定要读写的文件类型。

void CKDrawBase::save()

{

BasicInfo binfo;

binfo.vstr.push_back("aaaaxx");

binfo.vstr.push_back("tttt55");

//fstream fsm("CKDrawLine.dat",ios::in|ios::out);

fstream fsm;

fsm.open("CKDrawLine.dat",ios::out);

fsm.close(); // 之所以这样做,是因为这三行,才能保证 CKDrawLine.dat 创建文件 ,不然创建不了文件,无法进行读写 参见 http://blog.csdn.net/begges/article/details/5958347
fsm.open("CKDrawLine.dat",ios::in|ios::out);

fsm<<binfo;

fsm.close();

}

3.若在文件的打开方式中没有特别说明,打开的文件均为ASCII码文件,若要打开二进制文件,则要特别说明并用特定的读写函数。二进制文件操作:

infile.open(“inf1.dat”, ios::in| ios::binary);outfile.open(“outf1.dat”, ios::out| ios::binary);

由于二进制文件中的数据不是ASCII码,故不能直接对其读写,必须要通过特定的函数予以转换。

infl.open("1.txt",ios::in|ios::binary);outfl.open("2.txt",ios::out|ios::binary);

infl.read(buf,300);

int n=infl.gcount();

outfl.write(buf,n);

cout<<buf;

文件指针:当一打开文件,文件指针位于文件头,并随着读写字节数的多少顺序移动。可以利用成员函数随机移动文件指针。

infile.seekg(int);//将文件指针移动到由参数指定的字节处

infile.seekg(100);//将文件指针移动到距离文件头100个字节处

infile.seekg(int, ios::_dir);_dir: beg:文件头 cur:当前位置 end:文件尾

infile.seekg(-500, ios::end);//移动到距文件尾前500个字节

对ASCII文件操作:对ifstream和ofstream操作时,可将ifstream看作是cin,将ofstream看作为cout。直接用>> <<操作。

对二进制文件操作:将ifstream和ofstream加ios::binary操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: