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