C++入門(7):對象
類 = 屬性 + 方法;
類名的第一個字母一般採用大寫,類聲明的末尾必須加上分號“;”;C++允許在類裏聲明常量,但不允許對它賦值,除非創建一個靜態常量。
構造器
1)構造器的名字和它所在類的名字一樣;
2)系統會在創建出某個新實例之後,立刻自動調用這個類的構造器;
3)構造器永遠不返回任何值。
如果沒有在類裏定義一個構造器,編譯器會自動創建一個,形式爲:ClassName::ClassName(){},還會創建一個副本構造器。
構造器經常需要重載,即同一個類可以有多個構造器定義,它們名字一樣,只是在輸入參數的個數和類型上有差異。
析構器
在銷燬一個對象時,系統會自動調用類的另一個特殊方法:析構器;
析構函數名也是類名,只是函數名前多了一個波浪符(~);
析構器永遠不返回任何值且不帶輸入參數,聲明只有一種形式:~ClassName()。
this 指針
在類裏, this 指針代表當前對象,其基本用途是避免二義性(尤其在引用變量和屬性的時候)。
下面通過舉例及講解來認識C++中對象的相關知識:
#include <iostream>
class Student{
public:
static const bool flag = true ; //靜態常量,這樣是可以的!
char sex;
std::string yourName;
Student(char s); //構造函數,輸入參數有默認值時爲默認構造器,參數可選,一般來說,每個類至少應該有一個默認構造器
~Student(); //析構函數
void print(std::string name); //給類添加方法:1)先在類的聲明裏創建一個方法的原型;2)方法的定義(實現)通常在類聲明的後面 。
void inputName() ;
};
//如果在類聲明裏聲明和定義函數,其效果等同於在請求編譯器把每個函數當做一個內聯函數來對待。
Student::Student(char s) //如果構造器聲明改爲:student(char sex);則爲避免二義性,構造器定義中的賦值應改爲:this.sex = sex;
{
std::cout << "I am a Constructor." << std::endl;
sex = s;
}
Student::~Student()
{
std::cout << "I am a Destructor." << std::endl;
}
void Student::print(std::string name) //定義類的方法的函數體時,必須指明該方法屬於哪個類 :ClassName::functionName
{
std::cout << "Nice to meet you, " << name << std::endl;
std::cout << "You are " << sex << std::endl;
}
void Student::inputName()
{
std::cout << "Honey, what's your name? " << std::endl;
if(flag)
{
std::cin >> yourName;
if(std::cin.good())
{
print(yourName); //類中方法可以相互調用
}
else
{
std::cout << "See you next time." << std::endl;
}
}
}
int main(int argc, char** argv) {
Student student1('F'); //創建類的實例,即對象;由於它的構造函數有參數,所以實例化時需要傳入參數
student1.inputName(); //調用類的方法
Student student2 = student1; //把一個對象賦值給另一個同類的對象將使同名的屬性有同樣的值
std::cout << "student2's sex is " << student2.sex << std::endl; //程序結束之後,需要調用兩次析構器
return 0;
}
運行結果爲:
I am a Constructor.
Honey, what's your name?
xiuxiu
Nice to meet you, xiuxiu
You are F
student2's sex is F
I am a Destructor.
I am a Destructor.