C++:随笔4--对象
類是一個模型,當我們為這個類創建實例的時候也就是對象的本身。
對象的內部可以有變量和函數,而結構通常只是由各種變量構成。對象與結構有很多相似之處,但是對象還可以有他們自己的函數。
類由變量和函數組成,對象將使用哪些變量來存儲信息,調用哪些函數來完成操作,所以習慣上類里邊變量成為屬性,函數成為方法。
OOP(面向對象編程過程):
第一步:創建一個類(每個類跟變量一樣都有一個名字,類名的第一個字母通常采用大寫)
“::”作用域解析符作用是告訴編譯器這個方法存在于何處,或者說是屬于哪一個類。
std::cout所引用的是std定義的cout,而std::string數據類型其實也是一個對象。
class Car
{public ://(public這個關鍵詞實際上就是作用域的問題)std::string color;std string eigine;float gas_tank;unsigned int Wheel;
//方法的聲明(寫在類里面)void fill_Tank(float liter);//只有一個參數,不需要返回值void running(void);//不需要返回類型,不需要參數
//方法的定義通常安排在類聲明的后面
};//可以直接在這個后邊定義類的對象Car(但是一般呢不這樣用,將聲明和定義是分開的)。
//方法的定義通常安排在類聲明的后面
void Car::fill_Tank(float liter)//::是作用域解析符(是在說fill_Tank這個函數是在Car這個類里邊的)
{gas_tank += liter;
}
int main()
{Car mycar;//使用Car這個類定義一個變量mycar(在創建類的對象時,也可以像結構那樣直接在大括號后邊進行定義),一個具體實例。擁有方法和屬性mycar.gas_tank=85;return 0;
}
PS:我們可以把類的聲明和類的函數的定義分別存入兩個不同的文件,聲明存入.h頭文件,定義存入相應的.cpp文件。
C++允許在類里面聲明常量,但是不允許對它進行賦值。
把一個對象賦值給另一個同類的對象將會自動使同名的的屬性有同樣的值。
class Car
{public:const float TANKSIZE=85;//這樣會出錯。
}
//繞開這一限制的方法就是創建一個靜態常量
class Car
{public:static const float TANKSIZE=85;//這樣會出錯。
};
Car car1,car2;
car2=car1;//把一個對象賦值給另一個同類的對象將會自動使同名的的屬性有同樣的值。
總結:開發程序最基本的步驟:
(1)定義一個有屬性(變量)和方法(函數)的類。(模板)
(2)為該類創建一個變量。(實現)
-------------------------擴展
構造器:
1、構造器和通常方法的主要區別:
- 構造器的名字必須和他所在的類的名字一樣。
- 系統在創建某個類的實例時,會第一時間自動調用這個類的構造器。
- 構造器永遠不會返回任何值。
2、創建構造器需要先把他的聲明添加到類里:
class Car
{Car(void);
}
3、注意大小寫和類名保持一致,在結束聲明之后開始定義構造器本身:
Car::Car(void)//因為構造器默認不會有任何返回值,所以我們不用寫為 void Car::Car(void)
{color="white";engine="V8";wheel=4;gas_tank=FULL_GAS;
}
4、構造器的作用就是對它進行初始化
class Car
{std::string color;std::string enigen;unsigned int gas_tank;unsigned int wheel;Car(void);void set color(std string col);void set enigen(std string eng);void set wheel(unsigned int whe);void fill tank(int liter);int running(void);void warning(void);
}
Car::Car(void)
{color="white";}
5、構造對象數組
數組可以是任何一種數據類型,當然也包含對象。
Car mycar[10];//Car是類名,后邊是一個數組
//調用的語法:
Mycar[x].running;//x表示給定數組元素的下標
6、注意每個類至少有一個構造器,如果你沒有在類里定義一個構造器,編譯器就會使用以下語法替你定義一個:
ClassName::ClassName(){}
析構器:
在創建對象時系統會自動調用一種特殊的方法,即構造器。
在銷毀一個對象時系統也應該會調用另一個特殊方法達到對應效果,即析構器。(一般來說構造器用來完成事先的初始化和準備工作(申請內存),析構器用來完成時候所必須的清理工作(清理內存))
1、析構器有著和構造器/類一樣的名字,只不過前邊多了一個波浪符“~”前綴。析構器也永遠不返回任何值。析構器是不帶參數的,所以析構器的聲明格式永遠是~ClassName();
class Car(void)
{Car();~Car();
}
//析構器是不帶參數的,所以析構器的聲明格式永遠是
~ClassName();
在我們剛剛上邊的例子中,析構器是可有可無的,(因為我們剛剛的例子并沒有涉及到內存的申請啊以及動態內存的申請,只不過是申請了幾個變量,而變量在這個函數,對象結束的時候由棧的機制它會自動返回,不用我們來處理;如果我們用這個new申請的一些動態內存的話,就必須在析構器里邊對它進行釋放;或者說我們打開一個文件也是對他進行申請內存,比如openfile后面就必須有closefile與之對應,那我們就必須分別寫在構造器和析構器里面),但是在比較復雜的類里,析構器往往非常重要。(可能會引起內存泄漏。也就是你申請了一塊內存沒有去用它,或者說你調用完這塊內存之后,你這個類消除了,但是你這塊內存沒有釋放,那么他就會在內存空間中存下,保留這個地址,當你不小心訪問到這個地址的時候,就會出現該內存不能讀,就會彈出錯誤對話框);例如某個類的構造器申請了一塊內存,我們就必須在析構器里釋放這塊內存。
#include<iostream>
#include<string>
#include<fetream>
class StoreQuote
{publis:std::string quote,sperker;std::ofstream fileOutput;StoreQuote();//構造器~StoreQuote();//析構器void inputQuote();void inputSpeaker();bool write();
};//類的聲明
StoreQuote::StoreQuote()
{fileoutput.open("test.txt",std::ios::app);//類.方法()打開一個文件,app表示追加的形式打開
}
StoreQuote::~StoreQuote()
{fileOutput.close();//析構器里邊對它進行關閉
}
void StoreQuote::inputQuote()
{std::getline(std::cin,quote);//寫入這句話,把他寫進quote這個字符串里邊
}
void StoreQuote::inputSpeaker()
{std::getline(std::cin,speaker);//寫入作者,把他寫入speaker這個字符串里邊
}
bool StoreQuote::write()//把剛才的兩個給寫入文件里邊
{if(fileOutput.is_open()){fileOutput<<qupte<<"i"<<speaker<<"\n";return true;}else{return false;}
}
int main()
{StoreQuote quote;std::cout<<"請輸入一句話:\n";quote.inputQuote();//調用這個函數std::cout<<"請輸入作者:\n";quote.inputSpeaker();if(quote.write())//判斷是否成功的寫入文件{std::cout<<"成功寫入文件";}else{std::cout<<"寫入文件失敗":return 1;}return 0;//main函數的默認返回值}
?
總結
以上是生活随笔為你收集整理的C++:随笔4--对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++:随笔3--复杂的数据结构
- 下一篇: C++:随笔5---this指针和类的继