(二)C++头文件与类的声明
目錄
一、C vs C++,關(guān)于數(shù)據(jù)和函數(shù)
二、class分類
2.1 complex(經(jīng)典不帶指針--復(fù)數(shù))
?2.2 string(經(jīng)典帶指針--字符串)
三、Object Based(基于對(duì)象)vs Object Oriented(面向?qū)ο?#xff09;
四、C++ programs代碼基本形式
五、Output(輸出區(qū)別),C++ vs C
六、Header(頭文件)當(dāng)中的防衛(wèi)式聲明與布局
6.1 guard(防衛(wèi)式聲明)
6.2 Header(頭文件)的布局
6.1.1 class 的聲明(declaration)
6.1.2 class template(模板)簡(jiǎn)介
一、C vs C++,關(guān)于數(shù)據(jù)和函數(shù)
????????在C語(yǔ)言中,設(shè)計(jì)程序時(shí),需要準(zhǔn)備數(shù)據(jù)Data與函數(shù)Functions,函數(shù)是用來(lái)處理數(shù)據(jù),那么這個(gè)數(shù)據(jù)Data會(huì)有很多類型(built-in內(nèi)置、struct結(jié)構(gòu)體),Data數(shù)據(jù)根據(jù)類型創(chuàng)建許多真值數(shù)據(jù)variables。這樣的缺點(diǎn)是由于語(yǔ)言沒(méi)有提供足夠的關(guān)鍵字,variables數(shù)據(jù)一定是全局的,對(duì)于所有Functions都可以處理variables,對(duì)后續(xù)有影響。
????????于是發(fā)展到了C++面向?qū)ο蟮恼Z(yǔ)言中,將數(shù)據(jù)Date Membres與Members Function進(jìn)行綁定,稱為class,相當(dāng)于C中的struct結(jié)構(gòu)體,但是多了很多新特性,即只有對(duì)應(yīng)的Members Function函數(shù)可以處理Data Members數(shù)據(jù),優(yōu)點(diǎn)是不會(huì)進(jìn)行混雜。Data Membres與Members Function綁定后,根據(jù)這些class,以這種形式,創(chuàng)建了很多的objects(對(duì)象),在objects中進(jìn)行處理。
二、class分類
? ? ? ? 在上一章中我們說(shuō),最經(jīng)典的class分類為不帶指針的與帶指針的,這里面最經(jīng)典的兩個(gè)分別是complex(復(fù)數(shù))與string(字符串)。
2.1 complex(經(jīng)典不帶指針--復(fù)數(shù))
????????complex有實(shí)部與虛部之分,那么根據(jù)complex創(chuàng)建出來(lái)的c1、c2……中每個(gè)都含有實(shí)部與虛部,這就是在內(nèi)存中占用的大小。在設(shè)計(jì)復(fù)數(shù)中還需要設(shè)計(jì)包含黃色的Functions,來(lái)處理c1、c2……,即一類函數(shù)處理多個(gè)數(shù)據(jù)。
? ? ? ? complex中把Date與Functions包含在一起,說(shuō)數(shù)據(jù)有很多個(gè)但函數(shù)只有一類,這個(gè)原因會(huì)在后面講到。
complex c1(2,1); complex c2; complex* pc = new complex(0,1);?2.2 string(經(jīng)典帶指針--字符串)
? ? ? ? 特別在于,對(duì)“Hello World”這類字符串,實(shí)際上其中只有一根指針(ptr),那么ptr要在內(nèi)存中指出這個(gè)字符串,這個(gè)字符串(內(nèi)容、即"Hello World")在另外設(shè)計(jì)這個(gè)類的內(nèi)存中,分配空間存儲(chǔ)這個(gè)字符串(內(nèi)容)。
? ? ? ? 所以創(chuàng)建出來(lái)的s1、s2……,這些字符串所占用的內(nèi)存大小中,實(shí)際上只有一個(gè)ptr。
string s1("Hello"); string s2("World"); string* ps = new string;代碼中創(chuàng)建方式是不同的,后續(xù)會(huì)說(shuō)到
三、Object Based(基于對(duì)象)vs Object Oriented(面向?qū)ο?#xff09;
Object Based:面對(duì)的是單一class的設(shè)計(jì)
????????omplex(復(fù)數(shù))--Class without pointer member(s))
Object Oriented:面對(duì)的是多重classes的設(shè)計(jì),classes和classes之間的聯(lián)系。
? ? ? ? string(字符串)--Class with pointer member(s)
四、C++ programs代碼基本形式
????????在一個(gè)C++ programs中,包含一個(gè)頭文件、主程序、標(biāo)準(zhǔn)庫(kù)(當(dāng)然這么分并不是很準(zhǔn)確但可以這里理解)。
? ? ? ? 主程序使用頭文件,使用include"---",使用標(biāo)準(zhǔn)庫(kù),使用include<--->。頭文件和標(biāo)準(zhǔn)庫(kù)都為.h文件,對(duì)聲明和標(biāo)準(zhǔn)庫(kù)的區(qū)別就是雙引號(hào)和尖括號(hào)的區(qū)別。
? ? ? ? 對(duì)于文件名,或者說(shuō)延伸的文件名(extension file name)可能不會(huì)是.h / .cpp的后綴,可能是.hpp或其他的,甚至無(wú)延伸的文件名。
五、Output(輸出區(qū)別),C++ vs C
? ? ? ? 在C 中使用#include<cstdio>或者#include <stdio.h>
#include <stdio.h>int main() {int i = 7;printf("i=%d \n" , i);return 0; }? ? ? ? 在C++中有更好的方法,#include <iostream.h>或者#include <iostream>,輸出中cout使用的更加自然
#include <iostream.h> using namespace std;int main() {int i = 7;cout << "i=" << i << endl;return 0; }六、Header(頭文件)當(dāng)中的防衛(wèi)式聲明與布局
6.1 guard(防衛(wèi)式聲明)
? ? ? ? 對(duì)complex.h中,有嚴(yán)格的頭文件寫(xiě)法,我們說(shuō)很多程序要用到這個(gè)聲明文件,或者說(shuō)自己用到,那么include中為了忽略次序引用,所以說(shuō)寫(xiě)一個(gè)guard(防衛(wèi)式聲明)。第二次進(jìn)行include時(shí)不會(huì)做多余的動(dòng)作。
????????(程序內(nèi)容不做詳細(xì)說(shuō)明,只說(shuō)COMPLEX是自己定義的)
#ifndef __COMPLEX__ #difine __COMPLEX__------------------ - - - - - - -······ - - - - - ------------------#endif????????那么在下列的以complex-test.h中,實(shí)際上對(duì)復(fù)數(shù)進(jìn)行的操作,就是中間主體部分,即“--------”之間的內(nèi)容。
#include <iostream> #include "complex.h" using namespace std;int main() {complex c1(2,1);complex c2;cout << c1 << endl;cout << c2 << endl;c2 = c1 + 5;c2 = 7 + c1;c2 = c1 + c2;.......return 0; }6.2 Header(頭文件)的布局
在一個(gè)基本的complex.h中,具體是以下布局
其中開(kāi)始的第一段“--------”到“-----------”為forward declarations(前置聲明)
第二段中為class declarations(類-聲明)重要
第三段中為class definition(類-定義)重要
#ifndef __COMPLEX__ #difine __COMPLEX__---------------------------------------------------- #include <cmath>class ostream; class complex;complex&__doapl (complex* ths, const complex& r); ------------------------------------------------------------------------------------------------------ class complex { ....... }; ------------------------------------------------------------------------------------------------------ complex::function... ---------------------------------------------------#endif6.1.1 class 的聲明(declaration)
class complex { public:explicit complex(double r = 0,double i = 0): re (r), im (i){ }complex& operator += (const complex&);double real () const { return re;}double imag () const {return im;}private:double re , im;friend complex& __doapl (complex* , const complex&); };? ? ? ? 在下列程序中,任何一個(gè)class都有class hand,在下方中第一個(gè)“ {? } ”中為class body。在class body中設(shè)計(jì)complex應(yīng)該是什么樣的數(shù)據(jù),是怎么樣的函數(shù),來(lái)滿足使用要求。
private:double re , im;? ? ? ? 這里是Data,上面就是就是Data的函數(shù),后續(xù)講到。friend為在設(shè)計(jì)另一類、單元、函數(shù)與現(xiàn)在的關(guān)系。
6.1.2 class template(模板)簡(jiǎn)介
????????在復(fù)數(shù)中最重要的是里面該有什么樣的信息,即有實(shí)部與虛部,代碼中為double re , im;
即實(shí)部re,虛部im都為double值,假如設(shè)計(jì)為浮點(diǎn)數(shù),整數(shù),那么需要再寫(xiě)一個(gè)class complex 將private:部分的double改為float/int,其余同理,只是類型不同而已。所以這里引出一個(gè)模板。
? ? ? ? 這里我們不將數(shù)據(jù)實(shí)部虛部類型寫(xiě)死,而是T(只是一個(gè)符號(hào))類,告訴編譯器,類型未定,則第一行寫(xiě)template<typename T>,為一個(gè)typename。
template<typename T> class complex { public:explicit complex(double r = 0,double i = 0): re (r), im (i){ }complex& operator += (const complex&);double real () const { return re;}double imag () const {return im;}private:T re , im;friend complex& __doapl (complex* , const complex&); };? ? ? ? 那么使用的時(shí)候再指定,寫(xiě)法如下:
{complex<double> c1(2.5 , 1.5);complex<int> c2(2 , 6);…… }? ? ? ? 但我們?cè)诤罄m(xù)寫(xiě)的時(shí)候依舊不會(huì)用到模板。
下一章:(三)C++構(gòu)造函數(shù)
總結(jié)
以上是生活随笔為你收集整理的(二)C++头文件与类的声明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: kickstart自动化系统安装_系统运
- 下一篇: C++控制台实现滚动字幕