日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

(二)C++头文件与类的声明

發布時間:2023/12/14 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (二)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... ---------------------------------------------------#endif

6.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++头文件与类的声明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。