精彩的類外定義
類內定義
問題:什么是類內定義?
將成員函數的函數體寫在類的內部的方式稱為類內定義。比如下面的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; }
運行結果: