关于类定义与IO操作
c++和c#的差别还是很大的,开始做一些练习,希望能借此多翻翻C++Primer,养成面向对象编程的习惯,熟悉类的定义,熟悉vim的基本操作和gcc的基本指令。
1
类定义写在XXX.h文件中,并且需要在首尾加上
#ifndef CLASS_XXX_H #define CLASS_XXX_H class XXX { ... }; #endif
否则很容易造成类重复定义。
类的成员函数的实现则写在XXX.cpp中,它和包含主函数的cpp文件一样,都需要#include头文件,这时#ifndef的用处就体现出来。
2
#include标准库函数最好不写.h,然后使用using namespace std;否则,比如如果写#include "string.h",再写using namespace std;可能会有冲突。。
3
编译多个文件的方法是g++ a.cpp b.cpp -o prog 输出可执行文件
编译单个文件的方法是g++ -c a.cpp 输出a.o目标文件。
然后 g++ a.o b.o之类的
4
ifstream的对象读取文件内容时,会一个单词一个单词的读取,需要使用getline函数,才能保留原来的换行格式。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int open() { cout<<"open:"<<endl; string fileName; ifstream file; cin>>fileName; cout<<endl; file.open(fileName.c_str());//以c的方式处理字符串 if(file) { string line; while(getline(file, line)) { cout<<line<<endl; } file.close(); file.clear(); return 0; } return -1; }
5
字符串流到文件流
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int save(Teacher &t) { string fileName; ofstream file; cin>>fileName; //设置文件模式,写入,转到文件末尾,不清除原文 file.open(fileName.c_str(), ofstream::out | ofstream::app); if(file) { stringstream strm; .... return 0; }
6
定义一个类时,如果含有另一个类的对象,作为数据成员,则构造函数需要用初始化列表进行传参,从而初始化该对象成员,或者成员对象具有无参的构造函数。
这时需要在类定义之前,先声明成员对象所对应的类,即
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//Student.h ... #include "Teacher.h" class Teacher;//不能写成extern class Teacher; class Student { ... Teacher classTeacher; ... Student(....); }; //Student.cpp #include "Student.h" class Teacher; Student::Student(... ,Teacher &mClassTeacher, ...):classTeacher(mClassTeacher) {...}