3. 成员函数的类内声明和类外实现

在 C++ 语言中,在编写代码时通常将类(和结构)拆分成声明和实现两部分。声明部分通常写在 .h 文件中,内部只写类的成员声明,供类的实现成员函数和使用此类创建对象时使用;而成员函数的实现部分(和静态成员变量的定义和初始化,后面才讲)通常写在 .cpp 文件中,通常实现部分会单独编译和链接。

以下面代码为例,此 main.cpp 文件中类 Square 的声明和实现都实现在一起,并且和使用此类的 main 函数写在同一个文件中。这样不利于模块化编程,也不利于类的重复利用。

// filename: main.cpp
#include <iostream>

using namespace std;

class Square {
    public:
        Square(double l=1) : length(l) {
            cout << "边长为" << l << "的正方形被创建!" << endl;
        }
        ~Square() {
            cout << "边长为" << length << "的正方形被销毁!" << endl;
        }
    private:
        double length;
};

int main(int argc, char * argv[]) {
    Square s1(3);

    return 0;
}

下面将上述的类 Square 拆成声明放在文件 square.h 中,将类 Square 的实现部分放在文件 square.cpp 中。将 main 函数放在 main.cpp 中。拆分结构如下:

文件:square.h

#ifndef __SQUARE_H__
#define __SQUARE_H__

class Square {
    public:
        Square(double l=1);
        ~Square();
    private:
        double length;
};

#endif  /* __SQUARE_H__ */

文件:square.cpp

#include <iostream>

#include "square.h"

using namespace std;

Square::Square(double l) : length(l) {
    cout << "边长为" << l << "的正方形被创建!" << endl;
}

Square::~Square() {
    cout << "边长为" << length << "的正方形被销毁!" << endl;
}

成员在类外实现时,需要使用 作用域限定符:: 来说明当前的函数属于某个类的成员函数。如果成员函数有缺省参数,则只能在声明时说明缺省参数的值,而在现实部分则不用给出缺省参数。

构造函数的初始化列表需要写在成员函数的实现部分。

文件:main.h

#include "square.h"

int main(int argc, char * argv[]) {
    Square s1(3);

    return 0;
}

编译和运行结果如下:

weimz@mzstudio:~$ g++ -o square.o -c square.cpp 
weimz@mzstudio:~$ g++ -o main.o -c main.cpp 
weimz@mzstudio:~$ g++ -o main main.o square.o 
weimz@mzstudio:~$ ./main 
边长为3的正方形被创建!
边长为3的正方形被销毁!

实验

将你之前写过的类拆解成类内声明和类外实现。