(GeekBand)C++面向?qū)ο蟾呒壘幊?第一周

課程目標(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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容