導讀:
關鍵字explicit
explicit 只對建構函式起作用,用來抑制隱式轉換。如:
class A {
A(int a);
};
int Function(A a);
當調用 Function(2) 的時候,2 會隱式轉換為 A 類型。這種情況常常不是程式員想要的結果,所以,要避免之,就可以這樣寫:
class A {
explicit A(int a);
};
int Function(A a);
這樣,當調用 Function(2) 的時候,編譯器會給出錯誤資訊(除非 Function 有個以 int 為參數的重載形式),這就避免了在程式員毫不知情的情況下出現錯誤。
總結:explicit 只對建構函式起作用,用來抑制隱式轉換。
1.視C++為一個語言聯邦
(1)c
(2)object-oriented c++(c with classes)
(3)Template c++
(4)STL
c++究竟比C強大在什麼地方呢,(1)C++相容C,即C有的C++都有。(2)引入了類,即物件導向。(3)泛型程式設計。(4)模板庫,提高了編程的效率。
2.盡量用const,enum,inline替換#define
1)宏是代碼處不加任何驗證的簡單替代,而內嵌函式是將代碼直接插入調用處,而減少了普通函數調用時的資源消耗。
(2)宏不是函數,只是在編譯前預先處理階段將程式中有關字串替換成宏體。
(3)inline是函數,但在編譯中不單獨產生代碼,而是將有關代碼嵌入到調用處。
總結如下:
對於一般常量,最好用const和enum替換#define;
對於類似函數的宏,最好改用inline函數替換#define
3.儘可能使用const
(1)將某些東西聲明為const可協助編譯器偵測出錯誤用法;
(2)。。。
4.確定對象被使用前先被初始化
(1)內建類型使用前最好初始化,避免不必要的錯誤;
(2)建構函式初使化最好採用初值列而不要在建構函式本體內使用賦值操作
CA::CA(int a,float b,string c):m_a(a),m_b(b),m_c(c){}//初值列初始化
CA::CA(int a,float b,string c):m_a=a,m_b=b,m_c=c{}//賦值初始化(仍會先調用初值,所以效率低)
5.瞭解C++默默編寫並調用哪些函數
(1)無參建構函式,但使用者一旦定義建構函式則系統不再提供;
(2)copy建構函式,如C c1; C c2(c1);
(3)copy assignment操作符
"=",如c2=c1;
(4)解構函式
6.若不想使用編譯器自動產生的函數,如何明確拒絕。
如每個對象都是獨一無二的,不允許對象間的copy構造和賦值。
(1)類中將copy建構函式和copy assignment聲明為私人。
(2)基類中將copy建構函式和copy assignment聲明為私人,衍生類別繼承基類即可。
ps:熱忱歡迎朋友們進行評論,對理解不足之處加以指點。