谭浩强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操作。
第十三章 运算符重载
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操作。
相关文章推荐
- 谭浩强C++笔记(11-12章)
- 谭浩强C++笔记(7-10章)
- 谭浩强C++笔记(1-6章)
- Exporting a function in a DLL using Microsoft Visual C++ 6.0
- C++ (P70—P96)
- C++中new与malloc的10点区别
- C++中的虚函数(virtual function)
- 对于C++ Builder 使用DevPress 控件中的TCXGrid 添加复选框 在勾选时会闪退
- delete与delete[]
- C++在类内定义模板函数
- C++ primer 第五版 中文版 练习 12.20
- C,C++宏中#与##的讲解
- C++中#include<iostream.h>和#include<iostream>
- MyString类的实现--C++ primer plus 读书笔记
- C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理
- C++学习方法
- C/C++字符串
- C++中的单例模式
- 声明已被否决 VS C++
- C语言编码与字符转换