《C++大学教程》学习笔记(二、三)

《C++大学教程》学习笔记(二、三)

第二章太基础,唯一学到的就是#include也是预处理,之前一直疏忽了。
下面是第三章。

1.类接口与实现的分离

良好的软件工程要做到成员函数对于客户代码是隐藏的(即信息隐藏),所以在第三章中书中对于GradeBook类给了这样一个实例:

  • GradeBook.h:使用函数原型定义类的借口
  • GradeBook.cpp:在独立的源文件中实现成员函数

简而言之,就是把原来挤在一个源文件里的代码分离成下面这种样子:

《C++大学教程》学习笔记(二、三)_第1张图片

很奇怪,当年上C++课的时候老师没怎么提这种做法,但做项目的时候参考别人的代码发现就是这么做的。

另外,尽管成员函数是在.cpp文件中实现的,但在main.cpp中仍然是#include “GradeBook.h”就可以了,因为在.cpp文件中每个成员函数都通过作用域分辨标识符(::)唯一的“捆绑”到了.h中的类定义上。

2.set与get函数

对于类中的数据成员,都应当有其对应的set与get函数。不仅如此,类中的其他成员函数也当使用get与set来访问数据成员(尽管它们能直接访问)。

使用set函数还有一个好处就是可以确认数据的有效性。

3.getline与cin

getline属于头文件string,cin属于iostream。

  • cin是读取字符直到遇到第一个空白间隔符
  • getline是读取连续字符直到遇到第一个换行符为止

getline函数的调用方式是getline(cin , string类型的变量);

4.一个包含构造函数的完整代码

GradeBook.h文件:

#include 
#include 
using namespace std;

class GradeBook{
private:
    string courseName;

public:
    explicit GradeBook(string);
    void setCourseName(string);
    string getCourseName() const;
    void displayMessage() const ;
};

GradeBook.cpp文件:

#include "GradeBook.h"

GradeBook::GradeBook(string name){
    setCourseName(name);
}

void GradeBook::setCourseName(string name){

    if (name.size() <= 25)
        courseName = name;
    else{
        courseName = name.substr(0,25);   //复制子字符串:从下表0开始,长度为25
        cerr << "More than 25!\n" ;       //cerr用来输出错误信息
    }
}

string GradeBook::getCourseName() const{
    return courseName;
}

void GradeBook::displayMessage() const {
    cout << "Welcome to:" << getCourseName() << endl;
}

main.cpp文件:

#include "GradeBook.h"

int main(int argc, const char * argv[]) {

    GradeBook myGradeBook1("book 1asfqwqecqd qwd 2hsjssssssssqq");
    GradeBook mygradeBook2("book 2");

    myGradeBook1.displayMessage();
    mygradeBook2.displayMessage();

    myGradeBook1.setCourseName("book 1");
    cout << "\nAfter setting...\n\n";

    myGradeBook1.displayMessage();
    mygradeBook2.displayMessage();


    return 0;
}

你可能感兴趣的:(C++)