代码改变世界

白话C++系列(9)-- 类内定义与类外定义

2016-04-23 14:29  Keiven_LY  阅读(9365)  评论(1编辑  收藏  举报

精彩的类外定义

类内定义

问题:什么是类内定义?

将成员函数的函数体写在类的内部的方式称为类内定义。比如下面的Student的类,我们可以看到,在定义成员函数的时候,包括每个成员函数用于实现的函数体,都在类的内部。

类内定义与内联函数的关系

类内定义的成员函数,编译器会将其优先编译为内联函数,但是对于复杂的成员函数无法编译成内联函数的,就编译成普通的函数

类外定义

所谓类外定义是指成员函数的函数体写在类的外面。具体来讲,类外定义又分为以下两种形式:

所谓同文件类外定义,是指成员函数虽然定义在类的外面,但是其定义与类的定义在同一个文件当中。如下面的例子:

我们新建一个文件,文件名为Car.cpp,然后在这个文件中定义一个Car的类,定义的时候先写上汽车这个类的定义(class Car),并申明相应的成员函数,但是成员函数的实现或者说成员函数体的定义也写在这个文件中。那么成员函数既然写在了类的外面,我们就要标示出这个成员函数不是普通的函数,而是属于Car这个汽车的函数,我们就需要在这个函数的前面用这个类名再加上::标记出这个函数是属于这个类的。

下面介绍分文件类外定义,如果说同文件类外定义算是游击队的话,那分文件类外定义可以算是正规军了。几乎所有的c++项目,但凡是专业一点的c++程序员都会将类的定义分文件来完成,这样做有诸多好处,我们会在后续的课程中来给大家逐步讲解。下面来看一个例子来给大家说明分文件类外定义的写法。

分文件定义的时候,我们需要定义一个.h文件(头文件),类名建议与文件名写成一致。如下是一个Car.h头文件,在头文件中我们申明了类中的所有的数据成员和成员函数,在另外一个文件(Car.cpp)中,我们把所有的成员函数进行定义,定义的方式跟以前一样,最为关键的一点是需要将其头文件(Car.h)包含到Car.cpp中,如果没有这样的包含,Car.cpp将无法找到其相应的申明。

代码实践

题目描述:

/*  ************************************************************************/

/*  定义一个Teacher类,要求分别采用同文件类外定义和分文件类外定义的方式完成,具体要求如下:
/*   数据成员:
/*       名字
/*       年龄
/*       性别
/*   成员函数:
/*       数据成员的封装函数
/*       授课teach
/*  ************************************************************************/

类内定义方式:

#include<iostream>
#include<stdlib.h>
#include<string>

using namespace std;

class Teacher
{
public:
    void setName(string _name);
    string getName();
    void setGender(string _gender);
    string getGender();
    void setAge(int _age);
    int getAge();
    void teach();

private:
    string m_strName;    
    string m_strGender;
    int m_iAge;
};


void Teacher::setName(string _name)
{
    m_strName = _name;
}
string Teacher::getName()
{
    returnm_strName;
}
void Teacher::setGender(string _gender)
{
    m_strGender = _gender;
}
string Teacher::getGender()
{
    returnm_strGender;
}

void Teacher::setAge(int _age)
{
    m_iAge = _age;
}
int Teacher::getAge()
{
    returnm_iAge;
}
void Teacher :: teach()
{
    cout<<"现在开始上课....."<<endl;
}


int main()
{
    Teacher t;
    t.setName("孔子");
    t.setGender ("");
    t.setAge(30);
    cout<<t.getName() <<" "<<t.getGender() <<" "<<t.getAge() <<" "<<endl;
    t.teach();
    system("pause");
    return 0;
}

运行结果:

类外定义方式:

程序框架如下

头文件(Teacher.h)

#include<string>
using namespacestd;
class Teacher
{
public:
    void setName(string _name);
    string getName();
    void setGender(string _gender);
    string getGender();
    void setAge(int _age);
    int getAge();
    void teach();

private:
    string m_strName;    
    string m_strGender;
    int m_iAge;
};

源文件:

#include"Teacher.h"
#include<iostream>
#include<stdlib.h>

usingnamespacestd;

/*  ************************************************************************/

/*  定义一个Teacher类,要求分别采用同文件类外定义和分文件类外定义的方式完成,具体要求如下:
/*   数据成员:
/*       名字
/*       年龄
/*       性别
/*   成员函数:
/*       数据成员的封装函数
/*       授课teach
/*  ************************************************************************/

void Teacher::setName(string _name)
{
    m_strName = _name;
}
string Teacher::getName()
{
    returnm_strName;
}
void Teacher::setGender(string _gender)
{
    m_strGender = _gender;
}
string Teacher::getGender()
{
    returnm_strGender;
}

void Teacher::setAge(int _age)
{
    m_iAge = _age;
}
int Teacher::getAge()
{
    returnm_iAge;
}
void Teacher :: teach()
{
    cout<<"现在开始上课....."<<endl;
}


int main()
{
    Teacher t;
    t.setName("孔子");
    t.setGender ("");
    t.setAge(30);
    cout<<t.getName() <<" "<<t.getGender() <<" "<<t.getAge() <<" "<<endl;
    t.teach();
    system("pause");
    return 0;
}

运行结果: