規則:
應該將修飾符* 和 &緊靠變量名。例如:int *a; int &a;
類的版式:
類可以將數據和函數封裝起來,其中函數是表示類的行為。也可以稱為是服務。類提供了關鍵字public ,protect ,private用于聲明哪些是公共的,哪些是保護的,哪些是 私有的。這樣可以讓類隱藏必要的東西。
類的版式主要有兩種版式:
(1):第一種將privte類型的數據 寫在前面,將public類型的數據寫在后面。采用這種版式的程序員主張“以數據為中心,”重點關注類的結構。
(2):第二種版式是將public類型寫在前面。將private寫在后面。這種版式的程序員主張“以行為為中心”。重點關注的是類應該提供什么樣的接口(或者服務)。
我建議大家采用“以行為為中心的”的這種類的 版式。因為這樣設計類的時候。首先考慮的類可以提供什么洋的服務。而且方便用戶閱讀。
空行:
空行起著分隔程序段落的作用。
(1):在給個類的聲明之后,函數的定義之后,都要加上空行。
(2):在一個函數體內,邏輯關系密切的相關語句之間不可以加上空行。
代碼行:
(1):一行代碼指做一件事情。例如:只聲明一個變量。
(2);if ,for while,do等語句自占一行。執行語句不能緊跟其后。
建議:在定義變量的同時。初始化該變量。
如果變量的引用和定義的地方比較遠,那么很容易就會忘記了變量的初始化。如果引用了一個沒有初始化的變量,那么很有可能就會引起錯誤。
代碼行內的空格:
(1);關鍵字之后要有空格。向const ,virtual,case等關鍵字后面至少要留一個空格。否則的話,無法辨認關鍵字。象if.while, for等關鍵字后面緊跟一個空格在跟“(”以顯示關鍵字的。
(2):函數名之后不要留空格,緊跟“(”以和關鍵字區別。
對齊:
程序的分界符“{”和"}"應該獨占一行并且位于一列。
頭文件由三部分組成:
1:頭文件開頭出的版本和版權的 聲明。
2:預處理塊。
3:函數和類的結構聲明等。
規則:
(1): 為了防止頭文件被重復的引用,應該使用#ifndef/define/endif結構產生與處理模塊。
(2):用#include<filename.h>來引用標準庫的頭文件(編譯器將從標準庫目錄開始搜索)。
(3):用#include"filename.h"來引用非標準庫的頭文件(編譯器將從用戶工作的目錄開始搜索)
建議:頭文件中一般只存放“聲明”,而不存放“定義”
定義文件的結構:
定義文件的 內容有由三部分組成:
(1): 定義文件開頭處的版本和版權;
(2):對一些頭文件的引用;
(3):程序的實現體(包括數據和代碼)
頭文件的作用:
(1):通過頭文件來調用庫功能。在很多場合源代碼不能(或者不準)提供給用戶。只提供給用頭文件或者二進制的庫。用戶只需要按照頭文件中的接口的聲明來調用庫功能。而不必關心接口是如何實現的。編譯器會從庫中提取相應的代碼。
(2): 頭文件可以用來加強類型安全檢查。如果某個接口被實現或者被實用的時候,其方式和在頭文件中的聲明不一致的時候,編譯器就會報錯。這一簡單的規則可以大大的減輕程序員調試和改錯的負擔。
目錄結構:
如果一個軟件的頭文件比較多(超過10個),就應該把頭文件和定義文件分開。分別保存在不同的目錄之中。以便于維護。
例如:可以將頭文件保存在inluude目錄之中。將定義文件保存在source文件之中。
如果某些頭文件是私有的,不會被程序直接引用,為了加強信息隱藏。那么可以把這些頭文件和定義文件放在同一目錄之中。
指針中存有另一個對象的地址,使我們可以間接的操作這個對象。
指針的典型用法是構建一個連接的數據結構,例如:鏈表(list)和數(tree)。并管理在程序運行的過程中動態分配的對象。以及作為函數參數類型。主要用來傳遞數組和大型類的對象。
每個指針都有相關的類型。
不同數據類型的指針之間的區別不在于指針的表示上,也不是指針所持有的值(地址)。——對于所有類型的指針這兩個方面都是一樣的。不同之處在于指針所指的對象的類型上。針織類型可以指定編譯器咋樣解釋特定內存上的指定的內容,以及該內存區域因該跨越多少內存單元。
變量名,即變量的標識符,可以由字符,數字,以及下劃線來組成。他必須以字符或者下劃線來開頭,并且區分大小寫。
語言本身沒有對變量名做什么限制。但是為了用戶著想,他不應過長。
c++保留了一些詞用作關鍵字。關鍵字標識符不能在作為標識符在程序中使用了。
對于命名對象有很多已經普遍接受的習慣。主要考慮的因素的是程序的可讀性。
第一:對象的命名一般用小寫。
第二:標識符通常用容易記憶的名字。
第三:對于多詞構成的標識符一般在詞的中間加上下劃線。
對象的定義:
一個簡單的對象的定義由一個類型指示符后面加上一個名字構成,以分號結束。
例如: int aaaaa;
當同類型的多個標識符被定義的時候,我們可以在類型指示符后面用逗號隔開。
一個簡單的定義指定了變量的類型和標識符。他并不提供初始值。
如果一個變量是在全局域(globe scope)中定義的,那么系統會保證給他一個初始值0。如果一個變量是在一個局部域中定義的,或者通過一個new 動態分配的,那么系統不會向它提供初始值0。這些對象被稱為未初始化(uninitialized),未初始化的對象不是沒有值,而是對象的值未被定義。
因為使用未初始化的對象是個很常見的 錯誤,并且很難被發現。所以建議為每個定義的對象進行初始化。
類機制通過缺省構造函數提供了類對象的自動初始化。
例如:
int main()
{
int val;////////未被初始化的值。
string project;//////通過string類的缺省的構造函數進行了初始化。
}
val是一個未被初始化的局部變量。
但是project是一個已經被初始化的類對象——被string類缺省的構造函數自動初始化。
初始化一個值可以在對象定義的時候進行。
c++支持兩種形式的初始化。
第一種是使用賦值符號的現實的操作。
如:
int val=111;
string project="ssssss";
隱式形式中,初始化值被放在括號中。
int val(111);
string project("sssssss");
在對象的定義之中,當對象的標識符在定義中出現后,對象名馬上就是可見的了。因此用對象初始化他自己是合法的,只是這樣做不是明智的。
例如:int val=val;///////合法,但是不是明智的。
另外,每種內置數據類型都支持一種特殊的構造函數。可將對象初始化為0。
/////設置val為0。設置dval為0.0。
int val =int();
double dval=double();
下列的定義中:
int()
vector <int>ival(10);
函數int()自動被應用到ival包含的10個元素上。
對象可以用任意復雜的表達式來初始化,也可以用返回值
變量為我們提供了一個有名字的內存存貯空間。可以通過程序對其進行 讀寫,處理操作。
c++中給個符號變量都有一個符號類型與之對應。這個類型決定了相關內存的大小,類型,布局,能夠存貯在該內存值的范圍。以及可以以用到其上的操作集。我們也可以把變量說成是對象(object)
。
變量和文字常量都有存貯區,并且都有相關的類型。區別在于變量是可以尋址的(adressable)常量文字是不可以尋址的(nonadressable),每一個變量都有兩個值與之聯系著,
1:數據值。存貯在內存的某個存貯區之中。有時候這個數據值也被稱為是右值(rvalue).我們可以認為右值是被讀取的值。文字常量和變量都可以被用來做右值。
2:它的地址值。即存貯它數據值的那塊內存的地址。它有時候被稱為左值(lvalue)。我們也可以認為左值的意思是位置值。文字常量不能被用作左值。
變量的定義會引起相關內存的分配。因為一個對象只能有一個存貯位置,所以一個對象只能被定義一次。如果在一個文件中定義的對象需要在另一個文件中被訪問,那么就會出現問題。
在c++中,對象在使用之前必須知道對象,引用一個未知的對象會引起編譯器的錯誤。
如果一個對象在另一個 文件中聲明著,我們想在這個文件中來使用這個對象,但是又不能在這個文件中在聲明相同的對象。那么我們可以使用extern關鍵字來聲明這個對象。
例如; file module.c
string aaaaa;
///定義了對象aaaaa
file module1.c
////需要使用對象aaaaa.,
////聲明對象aaaaa,使程序知道它。但是又不能引入第二個定義。
extern string aaaaa;
對象聲明是使程序知道對象的類型和名字。它由關鍵字extern后面跟對象的類型和對象的名字構成。
聲明不是定義,不會引起內存的分配。實際上它只是說明了在程序之外的某處有這個變量的定義。
雖然一個程序中只能包含一個對象的定義,但是可以包含很多的對象聲明。
比較好的做法是: 不是在每個要使用的文件中都單獨提供一個聲明。而是在在頭文件中聲明這個對象,然后在需要聲明這個對象的時候包含這個頭文件就好了。按照這個做法。如果需要修改對象的聲明只需要修改一次。就能維持多個使用這個對象的聲明文件的一致性。