白話C++系列(9)-- 類內定義與類外定義


精彩的類外定義

類內定義

問題:什么是類內定義?

將成員函數的函數體寫在類的內部的方式稱為類內定義。比如下面的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;
}

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM