課程目標:
培養正規的、大氣的編程習慣
以良好的方式編寫C++ Class
學習Classes之間的關系
這也是我這次參加這次課程的目標,希望可以學習到良好、正確的面向對象編程方法。
第一周課程內容
1.C++編程簡介
推薦書籍:
- 基礎類:《C++ Primer 5th》、《The C++ Promgramming Language》
- Effective系列:Effective C++ 3th、More Effective C++..
- STL基礎庫方面:STL源碼剖析
2.頭文件與類的聲明
Classes的兩個經典分類:
- Class without pointer members
- Class with pointer members
inline(內聯)函數
編譯器會優化inline函數,因此允許的情況下盡量使用inline函數,同時GoogleC++格式聲明中建議10行以內的函數,使用inline函數
本節課程中,提到一個編程的細節
Header文件中的防衛式聲明
#ifndef __MYCOMPLEX__ #define __MYCOMPLEX__ ... #endif //__MYCOMPLEX__
防止頭文件的內容被多次包含
私以為,對于C++語言而言,良好的編程習慣尤其重要
3.構造函數
此節中侯老師建議:編寫程序時,語法允許的情況下應當多使用簡潔、明了的寫法,這樣寫出的代碼易讀易改。例如:
class complex { public:
complex (double r = 0, double i = 0)
: re (r), im (i)
{}
}
4.參數傳遞與返回值
- pass by value
- pass by reference
pass by reference 效率更高,但要注意有些情況不能使用return by reference
在寫函數的時候,要考慮清楚到底該不該使用關鍵字const
C++中引用與指針的區別
聽課時,對指針和引用的概念和之間的區別不是很清楚,以下是Google之后結合自己以前學習Pascal的理解
首先從概念上講指針本質上是存放類的地址的變量,是可以改變的。引用是對象的別名,引用的存在必須依附于一個對象,并且在引用的生命周期內是不能改變的。
在使用指針和引用傳遞參數時,兩者有本質的區別:指針傳遞參數本質上仍然是值傳遞,指針傳進函數中后會在棧中創建指針的副本,在函數中所有的操作都是對指針副本的操作。而對引用參數的處理都會通過間接尋址的方式操作到主調函數中的相關變量。如果想通過指針參數傳遞來改變主調函數中的相關變量,那就得使用指向指針的指針,或者指針引用。
下面是三個例子說明引用和指針在函數參數傳遞時
- 例1:
#include <iostream>
void func1(int &pMyint);
int main() {
int test = 1;
int *p = &test;
printf("%p\n", p);
printf("%d\n", test);
func1(*p);
printf("%p\n", p);
printf("%d\n", test);
return 0;
}
void func1(int &pMyint){
int test = 10;
pMyint = test;
}
運行結果為:
0061ff28
1
0061ff28
10
- 例2:
void func1(int *pMyint);
int main() {
int test = 1;
int *p = &test;
printf("%p\n", p);
printf("%d\n", test);
func1(p);
printf("%p\n", p);
printf("%d\n", test);
return 0;
}
void func1(int *pMyint){
int test = 10;
pMyint = &test;
}
運行結果為:
0061ff28
1
0061ff28
1
- 例3:
#include <iostream>
void func1(int *pMyint);
int main() {
int test = 1;
int *p = &test;
printf("%p\n", p);
printf("%d\n", test);
func1(p);
printf("%p\n", p);
printf("%d\n", test);
return 0;
}
void func1(int *pMyint){
int test = 10;
*pMyint = test;
}
運行結果為:
0061ff28
1
0061ff28
10