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