程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 『21天精通C++』第一周學習筆記

『21天精通C++』第一周學習筆記

編輯:C++入門知識

第一天:面向對象程序的設計把數據封裝在一個安全的外殼中,並使他們具有活動性,變量可以主動的對自己進行操作而非被動等待程序代碼對它操作。當需要打印變量內容時你不需要進行打印它們,只需要告訴變量進行打印自己。

上面說的變量和面向對象中說的對象理論上沒有什麼區別,只是C++這種OPP語言使數據具有了行為。

在C++中對象通常是指用戶自定義的數據類型的類變量或結構變量,用戶可以通過向這種數據類型添加函數使這個變量具有行為。

第二天:在學習C++之前用來定義自己的數據類型大概有以下三種方法:結構:struct;枚舉:enum;聯合:union通常把它們稱為集合數據類型。

當定義一個變量賦值後從未使過編譯時會警告,但程序可以通過。

函數是構成C++程序的主要部分。將程序分解為一些獨立的模塊,這些模塊就稱為函數,函數可以使程序的結構模塊化。

所有的函數都必須進行原型聲明,函數原型聲明可以放在頭文件中。負責告訴編譯器函數中將要使用的參數的個數和類型。格式如下:

函數類型 函數名(參數類型1 參數1[,參數類型2 參數2] [,......]);
函數的第一行和函數原型聲明一樣,區別只是最後的沒有分號。

函數的參數傳遞:

一種方法是用值傳遞,比較好理解,還有一種是傳遞實參的方法,及在引用調用函數方式時,將向函數傳遞參數的地址而不是參數的實際值。這樣的好處是函數可以返回多個值。
函數原型防止程序輸出時潛在的錯誤。

主函數不需要原型說明,因它被看作是一個自動說明原型的函數,主函數是第一個被執行的函數,且它不存在被別的函數調用的問題。

第三天:在使用IO流時需要頭文件IOSTREAM,當時用流操縱算子和格式標志時需包含IOMANIP。

指針真正的作用是用指針在兩個函數之間傳遞參數,和在堆中動態的分配內存。

void指針是全程指針,它可以指向任意的數據類型,除了const和volatile類型的指針外任何類型的指針變量都可以賦值給void類型的指針,甚至包括函數指針。

int i;//定義一個整形變量
int * ptrl;//定義一個指向整形的指針,也可以不嚴格的叫整型指針
i=10;
ptrl=&i;//&是取地址運算符,本例是將整型變量i的地址置於ptrl變量中

注意,void類型的指針在引用時必須強制進行類型轉換,而且把它們賦值給其他類型時也必須進行類型轉換。反過來一個普通的類型指針可以直接賦值給void類型。在進行強制類型轉換時必須把星號和類型轉換用括號括起來。 iptr=(int *)vptr;

以上討論同樣適合兩個函數之間的用不同類型的指針傳遞參數



第四天:引用是自動的能間接引用的一種指針。

  自動間接引用的意思是可以自動得到一個引用值而不必使用間接引用操作符*。引用產生變量的另一個別名。引用的作用是通過引用在函數之間傳遞和返回參數。

int i=9;//定義一個整數變量i並把9賦值給它
int *iptr=&i;//定義一個整數指針變量iptr並將整數變量的地址賦值給它
int &rptr=i;//定義一個引用rptr並讓它指向整數變量i,也就是rptr是i的一個別名,所有對rptr的操作都是對
file://rptr引用的變量i的操作。

如果要使用iptr所制的變量i,必須用*間接引用指針,而使用引用rptr所引用的變量i則什麼都不用直接使用rptr就行。

用&定義一個引用;
象使用一個自用間接引用的指針一樣使用引用;
為了簡化多重指針的語法引用可以引用一個指針;
在定義一個引用時一定要初始化;
不要用*來間接引用一個引用;
一個引用只是依附在其所指變量的一個別名,這種依附在引用的作用范圍內保持不變。

const int myage=18;
file://指向常數的指針:定義一個指針指向一個常數(雖然指向的不一定是常數)。
const int * aptrage=&myage;
file://常數指針:定義一個不能改變的指針,但它指向的值可以改變,同常數一樣必須在定義常數指針的時候進行初始化。
int * const aptrage=&myage;
file://指向常數的常數指針:前兩者結合。
const int * const aptrage=&myage;

用const來保護不應改變的值;
不能通過指針改變一個常數;
常數指針不可改變;
不能改變一個指向常數的常數指針和它指向的常數。
只讀引用(只讀別名):一個指向常數的引用;

int iv=18;
const int &rv=ic;//定義一個指向常數iv的引用,不允許通過rv改變iv因是只讀引用。

練習:

# include
main(){
int monthdays[]={31,28,31,30,31,30,31,31,30,31,30,31};
int *const mpmonth=monthdays;
for (int i=0;i<12;i++){
file://cout<<(mpmonth+i)< cout<<(i+1)<<"月有:"<<*(mpmonth+i)<<"天"< }
return 0;
}



第五天:new和delete是內存分配操作符,new用於分配內存,delete用於釋放內存。

堆是計算機中一大塊未使用的內存(除去操作系統和正在使用的應用程序所占內存之外的剩余內存),它的大小是隨時在改變的,所以是動態內存。

在用new分配內存時不必對返回指針做類型轉換。分配單一變量如int、float沒有意義,分配數組時只需一個指針指向它的多個元素。

char *eName=new char[9];
delete [] eName;//釋放為eName分配的所有內存。

堆不會自己初始化,必須用自己的數據初始化。
應該在分配內存時進行初始化

char * eName=new char(a);//這是一個字符。
char * eName=new char[9];//這是一個數組,有九個元素(如果是字符串,還要包括NULL0的空間)。
strcpy(eName,"base wood");//初始化數組的例子。

兩維或兩維以上的數組稱為多維數組,也可叫矩陣(一維以上的數組,也稱表)。
dataType (*matrixName)[numELs]....//矩陣變量的定義。
dataType//是任意的數據類型包括用戶自定義的
matrixName//矩陣變量的名
numELs//除第一維後的維的大小。

例子:

float (* table)[6];//定義矩陣變量
table=new float[5][6];//分配存放30個浮點數的內存給矩陣變量。
float * table[6]=new float[5][6];//可以合並為:
delete [] table;//全部釋放

異常處理是一個術語,指在一個錯誤(一個異常)發生時自動執行的函數,VC++的異常處理函數:
_set_new_handler(),在一個new失敗時用戶可以強迫異常處理程序執行自己的錯誤函數。_set_new_handler()自動檢測所有的new操作並在必要時進行干涉。



第六天:在VC++中函數參數的傳遞有按值傳遞和引用傳遞兩種方式。

如果接收函數改變了傳送給它們的參數的值,而且這些改變在調用函數中被識別,則認為是按地址傳送。

如果調用函數的參數在接收函數中保持不變則是按值傳遞。

所有的數組都自動被按地址傳遞,而不能按值傳遞數組,數組的名是一個指針。指針永遠等於數據的地址。

任何非數組變量都可以采用引用傳遞,只要在接收參數表中插入一個&符號就可以表示一個變量進行引用傳遞。

引用傳遞是高效的安全的,可以在接收引用參數前加const,以防止函數無意間改變了引用參數。

在函數原型中可以聲明缺省參數表,簡化編程。函數不只可以聲明一個缺省參數,可以按需要聲明多個,還可以混合常規參數。但缺省參數必須在參數表中所有常規參數的後面。

defFun(int,flost,int=12,char=a);//標准的函數聲明,可以不帶參數變量名。帶上變量名可以直接拷貝到函數的第一行,但函數的第一行不要求帶缺省值。

在一個程序開始運行時傳入的值稱命令行參數。當敲入一個或多個命令參數給一個程序時,這些參數是通過兩個變量來描述,一個是一個整型變量用於保存命令參數的個數,另一個是字符指針數組用於保存這些參數。每個數組元素指向一個參數。給個例子

main(int argc,*argv[])

argc和argv是標准名字,其中*agrv[]是一個指針數組,一個數組名是一個常數指針,所以argv是一個指向其它指針的指針。而argc保存的是實際的參數個數加1,第一個用於保存dos路徑和文件名。

第七天:將功能類似,但要求參數有不同的類型和數目的函數重載。
為所有的重載函數說明原型。不要僅僅改變重載函數的返回值,只有不同的參數表才能把重載函數區分開。

用戶給函數一個名字但VC在調用時會將此名字進行壓延成另一個名字這樣用來區分重載函數。
如果用戶希望不壓延函數調用,需要在程序的開頭插入一個非壓延函數清單。
extern "c" {
void cfun(int i,float x);
void cfun2(float x, float y);
}

重載運算符:operator...()//...表示所選擇的運算符,除了?:條件操作符,::域運算符,*間接引用運算符,.成員運算符。

在自定義數據類型上實現內部運算,使用重載運算符。不能對內部數據類型定義重載運算,也不能改變運算符的優先級別。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved