关于类定义与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函数,才能保留原来的换行格式。

ifstream显示文件内容
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

字符串流到文件流

save
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

定义一个类时,如果含有另一个类的对象,作为数据成员,则构造函数需要用初始化列表进行传参,从而初始化该对象成员,或者成员对象具有无参的构造函数。

这时需要在类定义之前,先声明成员对象所对应的类,即

类定义
//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)
{...}
原文地址:https://www.cnblogs.com/cybersword/p/2756249.html