目前分類:C++ (56)

瀏覽方式: 標題列表 簡短摘要

按此前往C++完整教學目錄

 

 

輸出的排版:

(1)利用cout.width(n);,可以預留n的空格的版面空間,使得下一次使用cout<<的輸出對象在此n格版面空間向右對齊。若n小於輸出對象所佔的版面空間,則不執行排版。又,一個英文字母或數字佔一個版面空間,一個中文字佔兩個版面空間。程式碼例如:

string a="111";

string b="222";

cout<<a;  //顯示111

cout.width(5);  //在顯示111後,預留5個版面空間。

cout<<b;    //222在預留的版面空間中向右對齊。現在整個螢幕顯示111  222

若要使預留的版面空間以特定字元顯示而非空白字元,則可以利用成員函式fill(特定字元),如:

cout.fill(‘*’);  //設要顯示的特定字元為 *

string a="111";

string b="222";

cout<<a; 

cout.width(5); 

cout<<b;  //整個螢幕顯示111**222

註:cout.width();只會影響在此行程式碼後的第一個cout<<輸出,若想要讓其他cout<<輸出也有此排版功能,則在其之前也要加上cout.width();

(2)利用換行字元’\t’

程式碼例如:

cout<<"aa\t"<<"bbb"<<endl;

cout<<"aaaaaa\t"<<"bbb"<<endl;

cout<<"aaaaaaaa\t"<<"bbb"<<endl;

顯示如下:

aa      bbb

aaaaaa  bbb

aaaaaaaa        bbb

也就是說,任何字串在加了\t之後,會被放在一個8個空格寬度」的預留空間,若字串寬度為n個空格寬度,且n<8,則會在此字串之後顯示8-n個空格。若n>8*k(k=1,2,3,4,5……),則在此字串之後顯示8*(k+1)-n個空格。

 

 

上一篇:檔案讀寫 控制參數

下一篇:檔案管理 輸出排版(2)

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

 要設定輸入/輸出的格式,可以使用C++提供的「I/O控制參數(或稱 I/O旗幟參數)」與setf()函式。

C++先說明I/O控制參數,I/O控制參數是定義在ios_base類別底下的整數常數,呼叫時需要在其名稱前面加上ios_base::。各種I/O控制參數的名稱和功用如下:

旗幟(flag)參數名稱

旗幟參數群組

功能

Ios_base::left

Ios_base::

adjustfield

輸出資料靠左對齊

Ios_base::right

輸出資料靠右對齊

Ios_base::internal

輸出資料正負號靠左對齊,數字靠右對齊

Ios_base::dec

Ios_base::

basefield

數據以十進位輸出(系統預設為成立)

Ios_base::hex

數據以十六進位輸出

Ios_base::oct

數據以八進位輸出

Ios_base::fixed

Ios_base::

floatfield

數據以小數點方式輸出

Ios_base::scientific

數據以科學記號方式輸出

Ios_base::showpoint

 

顯示浮點數的小數點與末位的0

Ios_base::showbase

 

八進位數字,數字之前加一個0

十六進位數字,數字之前加上0x

Ios_base::showpos

 

若數據為正數,在其之前加一個+

Ios_base::uppercase

 

十六進位數字與科學記號的字母,用大寫

Ios_base::skipws

 

輸入時,空白字元當作終止字元(系統預設為成立)

同一個旗幟參數群組中的旗幟參數,是不能同時設定為成立的。以下是利用I/O物件成員函式setf(旗幟參數)來設定旗幟參數為成立:

(1) 若要設定的旗幟參數有其所屬的旗幟參數群組,那麼:

setf(旗幟參數 , 旗幟參數群組);  //設定該旗幟參數為成立,

如:

cout.setf(ios_base::hex,ios_base::basefield);

cout<<62234<<endl;  //顯示 f31a

cin.setf(ios_base::hex,ios_base::basefield);

cin>>a; cout<<a;  //若輸入為12e3,則顯示12e3

(2) 若要設定的旗幟參數並沒有所屬的旗幟參數群組,那麼:

setf(旗幟參數 );  //設定該旗幟參數為成立,

如:

cout.setf(ios_base::showpoint);

cout<<2.334<<endl;  //顯示2.33400

(3) 當旗幟參數設定為成立後,會一直持續。也就是說,接下來的I/O物件的輸入/輸出格式都會以旗幟參數為準。若使用者不想要再以此種格式輸入/輸出,則可將旗幟參數重設或消除。

若旗幟參數有其所屬的旗幟參數群組,則需使用setf(旗幟參數 , 旗幟參數群組);來重設旗幟參數,若沒有其所屬的旗幟參數群組,則使用unsetf(旗幟參數);使旗幟參數恢復為不成立的狀態,如:

cout.setf(ios_base::hex,ios_base::basefield);

cout<<62234<<endl;  //顯示 f31a

cout.setf(ios_base::dec,ios_base::basefield);

cout<<62234<<endl;  //顯示 62234

又如:

cout.setf(ios_base::showpoint);

cout<<2.334<<endl;  //顯示2.33400

cout.unsetf(ios_base::showpoint);

cout<<2.334<<endl;  //顯示2.334

 

 

上一篇:檔案讀寫(IO) 簡介

下一篇:檔案管理 輸出排版

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

簡介:C++中,輸出和輸入(簡稱”I/O”)的資料是一串有著先後次序的資料串流data stream),

越先執行輸入或輸出命令的資料就越先被處理。輸入或輸出的資料來源可以是鍵盤或螢幕,以及檔案、字串。

C++使用相關的類別物件來處理I/O,以下是這些相關類別的類別架構class hierarchy)圖:

image

箭頭表示類別的繼承關係,AàB表示A類別繼承B類別。

ios_base類別和ios類別定義輸入物件與輸出物件的共同特性。

istream負責定義輸入類別,ostring負責定義輸出類別。

cinistream類別的一個物件,coutostream類別的一個物件。

ifstream/ofstream負責定義檔案資料的輸入/輸出。

istringstream/ostringstream負責定義字串資料的輸入/輸出。

iostream 同時掌管輸入與輸出。

  欲輸入或輸出的資料若原為二進位碼,則會被C++轉換為字元資料,這即是所謂的高階I/O (high-level I/O)(相對的,所謂的低階I/O (low-level I/O)是指輸入輸出的資料保持為二進位碼)。而之後再轉換成相對應的資料型態(stringboolint等等)C++將這些資料存放在輸入輸出物件(例如coutcin)緩衝區(buffer)中,使其有序的集合起來,待收到指令(譬如程式碼的執行或者輸入enter鍵)後再執行輸入或輸出的動作。

1. 檢查輸入與輸出的狀態,利用I/O物件的成員函式:good()fail()good()I/O物件成功輸入/輸出時回傳true,否則回傳falsefail()I/O物件輸入/輸出失敗時回傳true,否則回傳false

int a,b;

cout<<"請輸入a:";cin>>a;  //第一次輸入

if(cin.fail()){cout<<"輸入錯誤!";} 

else if(cin.good()){

cout<<a<<endl;

//第一次顯示(輸出)

cin.clear();

cout<<"請輸入b:";cin>>b;  //第二次輸入

if(cin.fail()){cout<<"輸入錯誤!";}

else if(cin.good()){

cout<<b<<endl;

//第二次顯示(輸出)

註一:由於所要輸入的型式是整數,若第一次輸入為10,則第一次輸出為10。又若第二次輸入為15,則第二次輸出為15

註二:若第一次輸入為aa,則第一次輸出為輸入錯誤!。此時若沒有cin.clear();這一行,C++會自動判定接下來的cin輸入也都是錯誤。

註三:使用C++進行輸入時,輸入的內容若有空白字元(空格)cin…等等的輸入類別物件會把空白字元當作終止字元(terminator),也就是執行輸入的指令。若第一次輸入為:1  100,則a=1,第二次輸入也不必使用者輸入了,b=100C++把空白字元分隔開的1100當作兩次的輸入了。

 

 

上一篇:類別(class) 嵌入

下一篇:檔案讀寫 控制參數

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

類別物件的嵌入(embedding)

所謂嵌入,事實上指的是將一類別A物件嵌入類別B內,使之成為類別B類別成員

比如我們將「人(person)」當作一個類別,「衣服(cloth)」當成一個類別,人擁有衣服,故將cloth嵌入person

範例如下:

class cloth //建立一cloth類別

{        

public:

string color;

cloth(){}         

cloth(string color_,int price_){

color=color_; price=price_;}

private:

int price;

};

 

class person  //建立一person類別

{       

public:

person(string name_,int age_)

{

name=name_;age_=age;

is_wear_jacket=false;

is_wear_shirt=false;

}

void wear_jacket (cloth cloth1)

{ jacket =cloth1;is_wear_jacket =true;}

void wear_shirt(cloth cloth1)

{shirt=cloth1;is_wear_shirt=true;}

void take_off_jacket ()

{is_wear_jacket =false;}

void take_off_shirt()

{is_wear_shirt=false;}

void get_wearing_condition()

{

if(is_wear_shirt && is_wear_jacket)

{cout<< name <<" wear "<<shirt.color<<" shirt and"<< jacket.color<<" jacket!"<<endl;

}

else if (is_wear_jacket)

{cout<<name<<" wear "<< jacket.color<<" jacket and no shirt!"<<endl;}

else if (is_wear_shirt)

{cout<<name<<" wear "<<shirt.color<<" shirt and no jacket!"<<endl;}}

 

cloth jacket;   //嵌入一cloth類別物件,名叫jacket

cloth shirt;        //嵌入一cloth類別物件,名叫shirt

private:

string name;

int age;

bool is_wear_jacket;

bool is_wear_shirt;    

};

 

// 主程式在此

person person1("weiwei",18);

cloth cloth1("blue",600);

person1.wear_shirt(cloth1);

person1.get_wearing_condition();  //顯示weiwei wear blue shirt and no jacket!

 

 

上一篇:類別(class) 抽象類別

下一篇:檔案讀寫(io) 簡介

文章標籤

埃伯 發表在 痞客邦 留言(2) 人氣()

按此前往C++完整教學目錄

 

 

純虛擬函式(pure virtual function)抽象類別(abstract class)

類別之中,可以定義純虛擬函式,純虛擬函式就是沒有函式內容的函式。方法為:

virtual 回傳資料型別 函式名稱() = 0;

只要一個類別中至少有一個純虛擬函式,那麼這個類別就被稱為抽象類別。一個抽象類別無法產生物件,只能用來被繼承。如:

class A

{

   public:

   int a;

   A(int a_){a=a_;}

   virtual int func_test() =0  ;   // func_test是純虛擬函式

};

A A1;           //這行是錯誤示範,因A是抽象類別,故無法定義物件。

註:C++規定,繼承抽象基礎類別的衍生類別,一定要將抽象基礎類別中的純虛擬函式給實做(implement)。如:

class A

{

public:

int a;

A(){}

A(int a_){a=a_;}

virtual int func_test() =0  ;   //純虛擬函式

};

class B :public A  //B繼承A

{    

public:

int func_test(){cout<<"test success!!";}  //在此,將純虛擬函式給實做

int b;

};

 

B B1;   //如果沒有將純虛擬函式給實做,這一行會出現錯誤。

B1.func_test();   //顯示test success!!

 

 

上一篇:類別(class) 衍生類別物件的複製

下一篇:類別(class) 嵌入

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

衍生類別物件可以複製給基礎類別物件。這樣一來,衍生類別繼承自基礎類別的成員會被複製過去,

不過在衍生類別中另外定義的成員則不會複製。如:

class A

{

       public:

    int a;

    private:

    int xx;

};

 

class B:public A  //類別B 繼承類別A

{  

    public:

    int b;

};

 

A A1;

B B1;

B1.a=10;

A1=B1;          //類別B的物件B1,複製給類別A的物件A1

cout<<A1.a;      //顯示10

cout<<A1.b;     //這一行是錯誤示範。b是衍生類別物件B1自定的成員,不會被複製到基礎類別物件A1內。

B1=A1;         //這一行是錯誤示範。基礎類別物件無法複製給衍生類別物件。因基礎類別物件裡沒有衍生類別物件自定的成員。

註:以上的複製方法,稱為「切割(sliding)」。也就是把衍生類別物件自定的成員給刪除,再複製給基礎類別物件。

 

 

上一篇:類別(class) 多重繼承

下一篇:類別(class) 抽象類別

文章標籤

埃伯 發表在 痞客邦 留言(1) 人氣()

按此前往C++完整教學目錄

 

 

多重繼承虛擬基礎類別

(a) 一個類別可以被許多不同類別繼承,而一個類別也可以繼承許多不同類別(這稱為多重繼承),如:

class A{//類別內容};

class B{//類別內容};

class C : public A, public B{//類別內容};  //類別C繼承了類別A,也繼承了類別B

做圖為:

ss

 

 

(b) 若有一種繼承形態為:

image

乍看之下,程式碼似乎應該是:

class A{//類別內容};

class B : public A{//類別內容};

class C : public A{//類別內容};

class D : public B, public C{//類別內容};

但這種繼承形態之下,類別D繼承了類別A兩次。事實上,為避免資料重複存取造成系統資源浪費或出錯,正確的程式碼應該是:

class A{//類別內容};

class B : virtual public A{//類別內容};  //利用virtual關鍵字B類別設成相對於D虛擬基礎類別

class C : virtual public A{//類別內容};  //利用virtual關鍵字C類別設成相對於D虛擬基礎類別

class D : public B, public C{//類別內容};

 

 

上一篇:類別(class) 衍生類別的建構式

下一篇:類別(class) 衍生類別物件的複製

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

衍生類別的建構式寫法:

設:

class A

{

protected:

int  x1;

public:

A(int  x1_){x1=x1_;}        //(1). 基礎類別的建構式寫

};

 

class B : public A

{

protected:

int  x2;

public:

B(int x1_,int x2_):A(x1_){x2=x2_;}  //(2). 衍生類別建構式寫

};

 

class C : public B

{

protected:

string x3;

public:

C(int x1_,int x2_,string x3_):B(x1_,x2_){x3=x3_;} // (3). 二階衍生類別建構式寫法

};

 

C ctest(5,5,"5");  //建構C類別物件ctest

註:承上,在建構ctest物件時,建構式執行的順序是:(3)à(2)à(1)à(2)à(3)。以此推之,執行階數越高的衍生類別的建構式,系統所耗費的執行是越多的。

 

上一篇:類別(class) 繼承

下一篇:類別(class) 多重繼承

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

若在寫程式時,需定義多個類別(比如類別A、B、C、D、E),而類別B、C、D、E擁有類別A的某些成員、或某些成員函式,

若在定義類別B、C、D、E都把這些成員、成員函式定義進去,會浪費程式碼空間。因此,此時就可以使用繼承(inherit )的方法。

說明如下:

B類別繼承(inherit )A類別,則稱A類別為基礎類別B類別為衍生類別。做圖為:

ss

衍生類別B因為繼承了基礎類別A,故擁有基礎類別A的某些類別成員。

繼承的程式碼為:

class A{//類別內容};

class B : 繼承方法 A{}; 

以上的繼承方法可以是publicprotectedprivate。說明如下:

繼承(inheritance)的方式有三種:

公共繼承,如下程式碼(最常用的繼承方法)

class B: public A{ //類別內容 };

表示衍生類別(B)可以存取基礎類別(A) 放在public, protected區域的資料。

且衍生類別(B)把基礎類別(A) 放在protected區域的資料放在自己(B)protected區域,把基礎類別(A) 放在public區域的資料放在自己(B)public區域。

保護繼承,如下程式碼:

class B: protected A{ //類別內容 };

表示衍生類別(B)可以存取基礎類別(A) 放在public, protected區域的資料。

且衍生類別(B)把基礎類別(A) 放在public, protected區域的資料放在自己(B)protected區域。

 

私有繼承,如下程式碼:

class B: private A{ //類別內容 };

表示衍生類別(B)可以存取基礎類別(A) 放在public, protected區域的資料。

且衍生類別(B)把基礎類別(A) 放在public, protected區域的資料放在自己(B)private區域。

 

範例如:

class person

{

public:

int age;

string name;

public:

person(int age_, string name_)

{age=age_; name=name_;}        

};

 

class teacher : public person

{

public:

int salary;

public:

teacher (int age_, string name_, int salary_): person(int age_, string name_)

{ salary = salary _; }        

};

 

class student : public person

{

public:

int score;

public:

student(int age_, string name_, int score_): person(int age_, string name_)

{ score = score_; }        

};

 

上例之中,teacher類別和student類別都繼承person類別。

 

2.  

基礎類別衍生類別是相對關係。相對一類別而言,其「衍層類別」指的是「n階衍生類別(n可以為任意正整數)」;其「基層類別」指的是「n階基礎類別(n可以為任意正整數)」。

若一函數的輸入參數列中,有一參數其資料型態為類別A的物件,則在呼叫函數時,此參數可以輸入任何A類別物件以及A衍層類別物件。如:

class A

{

public:

A(int a_){a=a_;}

int a;

};

class B: public A  //BA的一階衍生類別,因此也是A的衍層類別

public:

B(int a_,int b_):A(a_){a=a_;b=b_;}

private:

int b;

};

class C

{

public:

void print_a(A A1){cout<<A1.a<<endl;};  //此函數的參數是A類別物件

};

A A1(5);

B B1(10,60);

C C1;

C1.print_a(A1);  //此函數的參數可以輸入A類別物件。在此顯示5

C1.print_a(B1);   //此函數的參數也可以輸入B類別物件。在此顯示10

 

 

上一篇:類別(class) friend的用法

下一篇:類別(class) 衍生類別的建構式

文章標籤

埃伯 發表在 痞客邦 留言(1) 人氣()

< C++完整教學目錄 >

 

 

 C++提供一種方法,使類別A可以存取類別Bprivate區域的類別成員

中文翻譯做:友情宣告(friend declaration)。範例如:

class girl

{

public:

girl(string name_,int age_,int s)

{name=name_;age=age_;sweet_score=s;} 

friend class boy;   //宣告類別boy友情類別     

private:

string name;

int age;

int sweet_score;

};

 

class boy

{

public:

boy(string name_,int age_){name=name_;age=age_;} 

void select(girl g1,girl g2){  //因為類別boy是類別girl友情類別,所以可以存取類別girlprivate的類別成員

int like1=g1.sweet_score-g1.age;

int like2=g2.sweet_score-g2.age;

if(like1>like2)

{cout<<name<<" like "<<g1.name<<" more than "<<g2.name<<"!!"<<endl;}

else if(like2>like1)

{cout<<name<<" like "<<g2.name<<" more than "<<g1.name<<"!!"<<endl;}

else if(like1==like2)

{cout<<"cannot make decision!!"<<endl;}

}   

 

private:

string name;

int age;

};

 

 

void main() //主程式

{  

boy boy1("Jack",35);

girl girl1("wiewei",18,80);

girl girl2("nunu",22,85);

boy1.select(girl1,girl2); //顯示 Jack like nunu more than weiwei!!

}

 

 

上一篇:class(類別) static靜態宣告

下一篇:類別(class) 繼承

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

< C++完整教學目錄 >

 

 

若在建立類別時,欲讓所有該類別物件共享一個變數(意思是說,這個變數在所有該類別物件裡的值都一樣,若經更改,則此變數的值在所有該類別物件中也都更改。這種變數稱為靜態變數),可以使用:

static 變數型態 變數名稱;

(a) 注意:若要讓類別擁有靜態變數(靜態類別成員)則類別應該宣告在主程式之外。若要宣告靜態變數之初始值,也要在主程式之外宣告。如下:

class classA //在主程式外宣告類別classA

{    

public:

int a;

classA()  // 建構式在此

{a=5;obj_number++;}

static void print_obj_number()

{cout<<obj_number<<endl;}  //使用static定義靜態成員函式,專門用來處理靜態類別成員   

private:

static int obj_number;  //使用static定義靜態類別成員,也就是靜態變數

};

int classA::obj_number=0;  //使用 變數型態::靜態類別成員名稱= 來對靜態類別成員進行初始化。這一行也要打在主程式之外。

int main() // 主程式在此

{     

classA A1;

A1.print_obj_number();  //顯示1

classA A2;

A1.print_obj_number();  //顯示2

A2.print_obj_number();  //顯示2

classA A3;

A1.print_obj_number();  //顯示3

A2.print_obj_number();  //顯示3

A3.print_obj_number();  //顯示3

}

註一:若沒有對靜態類別成員進行初始化,C++會自動將其初始化為0

註二:靜態成員函式只能處理靜態類別成員,無法處理非靜態的成員。

註三:常數成員函式可以修改靜態類別成員。但靜態成員函式無法被定義成常數成員函式。

(b)類別中可以定義「靜態常數類別成員」,則對所有以此類別建立的物件而言,此成員的值都一樣,且不能更改。如:

class classA

{

private:

static const int a; //定義靜態常數類別成員

}; 

const int classA::a=5;

void mian(){

}

 

 

上一篇:類別(class) mutable

下一篇:類別(class) friend的用法

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

< C++完整教學目錄 >

 

 

一般來說,對一個常數物件而言,沒有任何方法可以更動其物件成員的值。但C++提供了一個「例外」的方法,來更動一個常數物件成員的值。

利用:mutable 變數形態 變數名稱; 將變數設為可容許變更的:

class classA

{

public:

mutable int a; //a設定為「可變更」的成員。就算在常數物件下也可以變更。

void seta_10()const{a=10;} //設定常數成員函式

int get_a()

{return a;}

classA(){ a=100;}  //建構子

};

const classA A;  //設定常數物件

A.a=5;        //這一行可行,因為a已經被設為mutable(可變動的)

cout<<A.a<<endl;  //顯示5

A.seta_10();   //這一行可行,因為a已經被設為mutable(可變動的)

cout<<A.a<<endl;   //顯示10

註:若把private區域的物件成員設為mutable,此物件成員仍然沒辦法由類別外的程式碼所讀取。

 

 

上一篇:類別(class) 常數物件

下一篇:class(類別) static靜態宣告

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

< C++完整教學目錄 >

 

 

常數物件常數成員函式:一個類別可以定義許多成員函式,但並不是每一個成員函式都對物件成員進行「存」的動作而更改物件成員的值。如果一個成員函式沒有更改物件成員的值,則可以被設為常數成員函式。

將函式設計為常數成員函式後,才可以被常數物件使用。如此一來,方能確保常數物件的物件成員值不會受到任何改變

範例如:

class classA

{

public:

int a;

int b;

int get_a() const {return a;}  //此一函式不會更改物件成員的值,可以將之設定為常數成員函式。

int get_b(){return b;}

void set_a(int a_) const {a=a_;}  //這一行是錯誤示範,此一函式有能力更改物件成員的值,不能設為常數成員函式。

void set_b(int b_) {b=b_;}

classA(int a_=5,int b_=10){a=a_;b=b_;}

};           

const classA A1; // 定義常數物件。註:定義常數物件時,一定要將物件成員的值都進行初始化。

cout<<A1.get_a()<<endl; //使用常數物件的常數成員函式

cout<<A1.get_b()<<endl; //這一行是錯誤示範。雖然此函式不會更改物件成員的值,但因為沒有被設為常數成員函式,所以不能被常數物件拿來使用。

A1.a=9; //這一行是錯誤示範。常數物件成員無法直接被類別外程式碼所設定。(不過一般物件放在public區域的物件成員可以被類別外程式碼所設定)

cout<<A1.a<<endl;  //常數物件放在public區域的物件成員可以直接被類別外程式碼所讀取,顯示5

 

註一:若一常數成員函式要被類別中的其他成員函式所使用時,要確保這「其他成員函式」也是常數成員函式,以確保常數物件成員的值不會遭到函式更動。

註二:就算一個物件不是常數物件,他也可以使用常數成員函式。

 

 

上一篇:類別(class) 建構式的初值設定列

下一篇:類別(class) mutable

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

< C++完整教學目錄 >

 

 

建構式的初值設定列(initialization list)

class girl

{

public:

girl(string name_="weiwei", int age_=18 )

{name=name_;age=age_;} //(1) 以傳統資料設定的方式,利用建構式直接設定物件成員初始值。

girl(string name_="weiwei", int age_=18 ):name(name_),age(age_){} //(2) 初值設定列的方式,利用建構式直接設定物件成員初始值。

//註一:上述(1)(2),只能選擇其中一種方法。若兩者皆寫入程式碼,會出錯。

void declare()

{cout<<"I like "<<name<<",she is "<<age<<" years ago."<<endl;}

private:

string name;

int age;

};

girl girl1;   //無論設計者寫了(1)還是(2),都是使用此法宣告物件。

girl1.declare();  //顯示I like weiwei, she is 18 years ago.

註二:(1)(2)的差異不大,若類別成員中包含參考資料型別(如:int &a;),則建議使用初值設定列方式。

 

 

上一篇:類別(class)類別物件陣列

下一篇:類別(class)常數物件

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

< C++完整教學目錄 >

 

 

類別物件陣列:利用建構式建立類別物件陣列:

class classA

{

public:

int a;

classA(int a_, int b_, int c_){a=a_;b=b_;c=c_;}  //設定此類別第一個建構式

classA(){a=5;b=10;c=15;}                  //設定此類別第二個建構式

void printvalue()

{cout<<a<<","<<b<<","<<c<<"."<<endl;}  //設定輸出所有類別成員的函

protected:

int b;

private:

int c;

} ;

classA matrixA[3]={classA(11,12,13), classA(21,22,23), classA(31,32,33)};  //利用建構式建立類別物件陣列的語法:類別名稱 陣列名稱[陣列元素數]={建構式, 建構式, 建構式};  註:一個類別可以有無限個建構式,此程式{}中可以是不同的建構式

matrixA[0].printvalue();  //顯示 11,12,13.

matrixA[1].printvalue();  //顯示 21,22,23.

matrixA[2].printvalue();  //顯示 31,32,33.

 

 

上一篇:類別(class)建構式

下一篇:類別(class)建構式的初值設定列

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

< C++完整教學目錄 >

 

 

3. 類別的建構式建構子constructor),形式和函式有點像(不過不需要回傳型別)建構式名稱需要和類別名稱相同。是在建立類別物件時,用來進行類別物件成員初始化的工具,可以在類別的public區域內設定建構式。且建構式可以對類別內任何區域的成員進行初始化。

class classA

{

public:

int a;

classA(int a_, int b_, int c_){a=a_;b=b_;c=c_;}  //設定此類別第一個建構式

classA(){a=5;b=10;c=15;}                  //設定此類別第二個建構式

void printvalue()

{cout<<a<<","<<b<<","<<c<<"."<<endl;}  //設定輸出所有類別成員的函

protected:

int b;

private:

int c;

} ;

classA A1(1,2,3);  //利用第一個建構式建立類別物件,並為類別物件成員設初始值。

classA A2;   //利用第二個建構式建立類別物件,並為類別物件成員設初始值。

A1.printvalue();  //顯示 1,2,3.

A2.printvalue();  //顯示 5,10,15

註一:類別建構式不一定要對所有類別物件成員進行初始化,只對其中一、兩個類別物件成員進行初始化也可以,沒有被進行初始化的類別物件成員便沒有值,或是也可以其他函式進行初始化。

註二:若程式設計者在一個類別沒有設定任何類別建構式,則C++會自動為該類別建立一個建構式(式碼中看不到),相當於 類別名稱(){},利用此建構式建立物件時,不會對類別物件成員進行任何初始化,如(2)中的classA A。稱為備用建構式」。

註三:利用建構式建立類別物件時,也可以使用「動態空間建構方式」,也就是使用指標pointer)來建構,程式碼如:

類別名稱* 類別物件名稱 = new 類別建構式

舉例:

classA *A1 =new classA (1,2,3);

classA *A2 =new classA;

不過這麼一來,若要呼叫類別物件成員函式就無法用:

類別物件名稱.類別物件成員函式名稱(參數1,參數2)

而要用:

類別物件名稱->類別物件成員函式名稱(參數1,參數2)

舉例:

A1->printvalue();

A2->printvalue();

 

 

上一篇:類別(class)簡介

下一篇:類別(class)嵌入

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

< C++完整教學目錄 >

 

* 朋友們若是覺得本教學對您有幫助,請點個讚~

 

類別(class結構(struct)很相像,是用來改善結構在使用上容易出現的一些風險。如上述,使用者很容易在結構外部對結構物件成員進行存取:

A.a=5;

為防止使用者不當操作導致出錯,故發展出類別。

類別比結構多了「區域畫分」,即在定義類別時可以將類別分割成三個區域:

public 區域:在此區域中的類別物件成員類別物件成員函式,可以直接被類別外部的程式碼呼叫而進行存取。可以被其他類別繼承

protected 區域:在此區域中的類別物件成員及類別物件成員函式,不能直接類別外部的程式碼呼叫而進行存取。但可以被其他類別繼承

private 區域:在此區域中的類別物件成員及類別物件成員函式,不能直接被類別外部的程式碼呼叫而進行存取。也不能被其他類別繼承

 

外部直接存取

繼承

public 區域

protected 區域

×

private 區域

×

×

(a)例:

class classA   //定義一個類別classA

{public:        //public區域和此區域的成員

int a; //:類別和結構一樣,無法在類別中將類別成員初始化

void set_c(int c_){c=c_;}    //public成員函數設定private區域成員的值,是可行的。

void get_c(){cout<<c<<endl;}   //public成員函數取出private區域成員的值,是可行的。

protected:

int b;

private:

int c;

};   //注意 } 後要加 ;

         

classA A;

A.c=10;  //此行錯誤,private區域中的成員無法在類別外直接存取

A.a=5;   //public區域中的成員可以在類別外直接存取

cout<<A.a<<endl;  //顯示5

A.set_c(10);   //public成員函數設定private區域成員的值

A.get_c(); //public成員函數取出private區域成員的值,顯示10

 

(b)public區域中設定成員函式,可以有不同的設定方法:

class classA 

{public:

int cut(int a,int b);  //public域中,只定義函式傳值、函式名稱、參數列,不寫函式內容。

};

class classB    //classBclassApublic域有同名成員函式cut

{public:

int cut(int a,int b); 

};

int classA::cut(int a,int b){return (a-b);} //在類別外才完整地定義函式,稱為對函式的「實做」。 注意:要在類別外實做函式,呼叫函式時需使用 類別名稱::函式名稱 來呼叫,否則若直接用函式名稱(cut)來呼叫,C++無法分辨要呼叫來自classA還是classBcut

int main(int argc, char *argv[])  //主函式

{

classA A;

cout<< A.cut(5,2)<<endl;

}

註一:此方法是為了節省類別的撰寫長度,提高程式的可讀性(尤其對於大型程式而言)

註二:要用此方法,則類別必須寫在主程式之外,而實做函式也必須在主程式之外。

註三:若private區域的函式,則不能用此方法。

 

 

上一篇:結構(struct)

下一篇:類別(class)建構式

文章標籤

埃伯 發表在 痞客邦 留言(2) 人氣()

< C++完整教學目錄 >

 

 

 結構structure)是類別class)的前身,有著部份類別所具有的功能:

建立結構的範例如下:

struct structA //利用struct 結構名稱{結構內容} 定義一個結構

{    

    // 定義結構成員

int a;

int b;

int fa(int i,int j) //定義結構函式

{return i+j;}

};   //注意:在 } 之後一定要加 ;

structA A; //利用 結構名稱 結構物件名稱 建立結構物件

A.a=5;  // 利用 結構物件名稱.結構物件成員名稱 存取結構物件成員

structA.a=5 //這行有錯,因為不能將結構成員設初始值,要設的應該是結構物件成員」。

A.b=10;

cout<<A.a; //顯示5

cout<<A.fa(A.a,A.b); 顯示15

 

下一篇:類別(class)簡介

文章標籤

埃伯 發表在 痞客邦 留言(2) 人氣()

按此前往C++完整教學目錄

 

 

二維矩陣的宣告方式:

(1) 不進行初始化的宣告方式:

資料型態 矩陣名稱[矩陣第一維長度][矩陣第一維長度];

如:int score[3][2];

(2) 直接賦值來進行初始化的宣告方式:

資料型態 矩陣名稱[矩陣第一維長度][矩陣第一維長度]={ 第一個子矩陣 , 第二個子矩陣 , 第三個子矩陣…};

如:int score[3][2]={ {1,2},{4,5},{6,8} };

(3) 統一賦值來進行初始化的宣告方式:

資料型態 矩陣名稱[矩陣第一維長度][矩陣第一維長度]={};,可將第一個子矩陣中序數為0的元素之值設成。至於其他元素之值,依資料型態而定,其規則和一維矩陣是一樣的。

如:int score[3][2]={0};,可將該二維矩陣中每個元素之值都設為0

 

2. 矩陣的用法:

(1) 取值:

矩陣名稱[N][M],其中NM是非負整數,可回傳在該矩陣中,序數為N之子矩陣、其中序數為M之元素之值。

(2) 設值:

矩陣名稱[N][M]=;,其中NM是非負整數,可設定在該矩陣中,序數為N之子矩陣、其中序數為M之元素之值為

 

 

上一篇:變數型態轉換

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

資料型態轉換

(1) 字串轉整數:這裡的字串也只是傳統字串char*,不是string。如:

int A=atoi("15");

cout<<A;  //顯示15

但:

string tt="15";

int A=atoi(tt); //這行出錯

又如果:

char* tt="15";

int A=atoi(tt);

cout<<A;   //顯示15

若要將string轉為傳統字串,可用c_str()成員函式如:

string tt="15";

int A=atoi(tt.c_str());

cout<<A;   //顯示15

(2) 整數轉字串:這裡的字串也只是傳統字串char*,不是string。如:

char S[]=""; 

int A=20;    

itoa(A,S,10);  //A為整數變數名稱;S為傳統字串名稱;10是進制,若為1010進制整數,若為1111進制整數,若為nn進制整數。(n對所有正整數都適用)

cout<<S;   //顯示20

註:atoi()itoa()兩函式在linux中通常沒有,在windows下才有。

(3) 強制型別轉換:

整數轉浮點數:

int a=5,b=13;

cout<<b/a<<endl;   //顯示2,乃是13/5無條件消去為整數

cout<<(float)a/(float)b<<endl;  //顯示2.6,相除時已經把ab都轉換為float型態

 

 

上一篇:計時器

下一篇:二維矩陣

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

«12 3