類是面向對象程序設計的基礎。對象,任何事物都可以稱爲對象。把對象可以進行的操作加入到對象的描述當中去,這樣的描述就可以稱爲“類”。
1.類的定義形式:
class<類名>
{
private:
...
protected:
...
public:
...
};
private,protected,public分別代表類的三種成員屬性,私有的、保護的和公有的。它們確定了類成員的(被)訪問權限
成員的訪問權限
類內訪問特性
類外訪問特性
private
可直接訪問
不可直接訪問
protected
可直接訪問
不可直接訪問
public
可直接訪問
可直接訪問
在這裏private和protected並沒有什麼區別,學習到繼承和派生的時候才能體現出它們兩的區別。
類成員包括成員變量和成員函數,成員函數既可以在類內定義,也可以在類外定義。
舉個例子:
#include<string>
#include<iostream>
using namespace std;
class Person
{
private:
string name;
string sex;
int age;
public:
void SetData(string n, string s, int a)
{
name = n;
sex = s;
age = a; //直接訪問
}
void GetName(string &na)
{
na = name;
}
string GetSex() //類內定義成員函數
{
return sex;
}
int GetAge(); //類內成員函數聲明
};
int Person::GetAge() //類外定義成員函數,函數名前要加上類名限定
{
return age;
}
void main()
{
Person a;
string name;
a.SetData("mike", "man", 12); //通過類的公有成員函數給私有成員賦值
a.GetName(name);
cout << "Name:" << name << endl;
cout << "sex:" << a.GetSex() << endl; //必須通過類成員函數訪問私有成員
cout << "age:" << a.GetAge() << endl;
system("pause");
}
2.構造函數和析構函數
上面代碼中先創建Person類對象a,再通過成員函數對a的私有成員賦值,是否可以一步到位呢?當然可以啦,使用構造函數。
構造函數的功能:在創建對象時,由系統自動調用,用給定的值對數據成員初始化。
在類體內定義構造函數的一般格式:
ClassName(<形參列表>)
{
...
}
在類體外加上類名限定
ClassName::ClassName(<形參列表>)
{
...
}
構造函數可以重載。不可以通過對象名調用。
析構函數的功能:系統在撤銷對象時,自動調用它來清理內存。
在類體內定義析構函數的一般格式:
~ClassName()
{
...
}
類外定義:
ClassName::~ClassName()
{
...
}
析構函數沒有參數,不給出返回值類型。一個類只有一個析構函數,不可以重載。
來看例子:
#include<string>
#include<iostream>
using namespace std;
class Person
{
private:
string name;
string sex;
int age;
public:
Person(string na = "nancy", string se = "woamn", int ag = 20)//構造函數,可以設置缺省值;如果沒有定義構造函數,系統會自動生成一個不帶 參數的缺省構造函數
{
name = na;
sex = se;
age = ag;
cout << "調用構造函數" << endl;
show();
}
void show()
{
cout << name << " " << sex << " " << age << " " << endl;
}
~Person()
{
cout << "調用析構函數" << endl;
show();
system("pause");
}
};
void main()
{
cout << "進入main函數" << endl;
Person a;
Person b("mike", "man", 15);
Person c("mike");
//a.show();
//b.show();
//c.show();
cout << "退出main函數"<<endl;
}
我們可以看到,析構函數是在main函數結束時調用的,對象的撤銷順序跟定義順序(調用構造函數的順序)相反。
調用構造函數和析構函數的時機(對象的生存週期)
對象其實是ClassName類型的變量,對象也分爲全局對象和局部對象,動態對象和靜態對象。構造函數在對象創建時系統自動調用,析構函數在對象撤銷時系統自動調用,不同存儲類別的對象自動調用它們的時機不同:
- 全局對象(一定是靜態的)。進入main函數之後,系統自動創建全局對象,調用構造函數,main()函數執行結束後,系統調用析構函數撤銷對象。
- 局部動態對象。程序進入作用域後,調用構造函數創建新對象,退出作用域時,調用析構函數撤銷對象。
- 局部靜態對象。在程序首次到達定義對象處,調用構造函數創建新對象,main()函數結束時,系統調用析構函數撤銷對象。
- 動態申請對象。使用new產生對象時,系統自動調用構造函數,使用delete撤銷對象時,系統自動調用析構函數。