學了好久的 C++了 發現自己對於C/C++還是沒有深入的了解 於是 咬咬牙啃起了 C++編程思想 希望能有所感悟 。。
我以前是直接學C++的對於C不是很了解,然而又是在VC下 學習 所以 沒有好好的 去學習 標准C++,直到我 看起C++編程思想 我發現真應該從頭再學一遍了 。。。
1、定義的聲明的區別 :
聲明是 聲明了標示符的存在 並沒有為 其分配空間 ,而定義 是為其分配的一定的存儲空間
int * p ;//這是對指針的聲明 並且定義
int p;//這是對整形變量的聲明並且定義
exern void show() ;==void show() ;
對於函數來說只要沒有函數體 那麼都是聲明 extern 表示對函數的聲明 表示這個函數是再外部定義的 。
我們在編譯器下 同時寫下
int i;
int i ;//會出現沖的定義的錯誤 編譯器會理解為"我到底改用那個i呢?"
extern int i ;
int i ;//那麼就不會出現錯誤 原因是 第一個i是一個對於變量的聲明 並沒有分配存儲空間 第二次 才為 i分配了存儲空間
2、 memcpy 函數 void *memcpy( void *dest, const void *src, size_tcount );
這個函數我們在C中經常用到 ,其實 他 跟 strcpy很類似 都是向目的類型的地址 拷貝 n個 內存塊
注意這裡的參數是 void* 因為我們是對內存塊進行操作 所以可以是任意數據類型
程序員對於內存的理解應該一視同仁 沒有類型的區別 。 只是我們在使用內存的時候 將二進制代碼 進行了 數據化了
3、 malloc函數和 calloc函數 assert函數
void *malloc( size_t size);
void *calloc( size_t num, size_tsize );
void assert( int expression ); //如果參數是FALSE那麼 強制終止程序的運行 也就是 非0 退出
這兩個函數都是在堆中分配指定大小的void* 內存區域 只是calloc可以進行初始化
而 malloc函數不進行初始化 。當malloc函數分配的內存在 第一次被使用的時候 那麼 它的每個單元的數據可能是 0
但是 如果分配來的這塊內存區域被使用過了 那麼就可能使任意數了 。
這裡我們會問free函數 做什麼了?
free函數 只是告訴編譯器 我們之前用malloc分配的內存區域 可以重復使用而已,在一定程度上可以理解為釋放
現在想想 我們的 fopen 函數和 fclose函數 所 用到的 FILE結構體也是 由此 而來的
4、標准庫的發放形式
我們在 VC中用到 string.h 等等頭文件 就可以使用裡面定義的函數 等等 我們可以找到 String.h 但是我們卻找不到他的實現文件 CPP (也就是源文件)
在以往的C庫的編寫中我們通常 將具有 統一功能 和 分類的 一組 數據類型 和函數放在一個 頭文件中定義 ,然後再原文件中實現 。然而我們到 微軟提供的VC下面卻找不到 這些對應文件的實現 。這是因為對於 微軟而言 我們是使用VC的用戶 ,雖然我們是軟件開發者,但是我們是在微軟的平台下使用。
微軟給我提供了的借口是 頭文件+動態鏈接庫的 形式 而不是 頭文件+源文件的形式 。
對於微軟而言 不會給我們 庫的實現部分 。只需要給我們提供動態鏈接庫,我們就可以使用它們所定義的函數 以及類型
5、重復定義的問題
#ifndef test
#define final
#endif
在一個較大的工程中我們可能會用到多個頭文件 架設 我們在多個頭文件中同時包含了 一個頭文件 那麼 在 編譯器進行編譯鏈接的時候
就會發生 數據類型或者 函數的 重復定義問題 為了解決這個問題 那麼我們要用到 預編譯指令
如果在 lib.h的頭文件下有 int i ; 為了防止被重復定義 那麼 我們在 lib.cpp中應該這樣定義
#ifndef lib_H_
int ;
#endif ;
這樣就可以防止統一數據 被重復定義的問題
6、 C++的封裝
C++的封裝 這是一個歧義的問題?
有些人把封裝用在解釋隱藏上 ,而我覺得用來解釋類這一個抽象數據類型很合適 、
在以前的C中 struct 結構體中我們吧 一組相關的 屬性組合成一個結構體 那麼這個結構體 只是作為數據的封裝,沒有其他的實際意義。
但是在C++中則不同了。
類中可以加入函數 ,等操作行為 使面向對象的思想得以很好的實現,一個類代表一類事物,一個類的實例代表一個對象 ,這個對象有自己的屬性和行為 。
我們把操作的函數封裝在類中 也可以避免C中函數命名重復的問題 。
6、聯合 Union 枚舉 enum的簡單實用
對於聯合 來說他的大小是成員中數據類型字節最大的存儲 我們在使用的時候 使用數據類型中的一個 可以節約存儲空間
enum其實定義的是基於 0開始的 一些數據成員 當然我們可以對枚舉成員進行賦值 簡單應用如下
#include <iostream>
using namespace std ;
enum Day
{
one =433,
two ,
three
};
union Me
{
int a ;
char buf[100] ;
};
void main()
{
Day a =one;
Day b= two ;
cout<<a<<endl ;
cout<<b<<endl ;
Me me1,me2 ;
me1.a=100 ;
strcpy(me2.buf,"dsfds") ;
cout<<"Union中的數字:"<<me1.a<<endl ;
cout<<"Union中的字符串:"<<me2.buf<<endl;
cout<<"Union的大小是:"<<sizeof(Me)<<endl ;
}
摘自 yue7603835的專欄