C++之類和對象


類是面向對象程序設計的基礎。對象,任何事物都可以稱爲對象。把對象可以進行的操作加入到對象的描述當中去,這樣的描述就可以稱爲“類”。

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類型的變量,對象也分爲全局對象和局部對象,動態對象和靜態對象。構造函數在對象創建時系統自動調用,析構函數在對象撤銷時系統自動調用,不同存儲類別的對象自動調用它們的時機不同:

  1. 全局對象(一定是靜態的)。進入main函數之後,系統自動創建全局對象,調用構造函數,main()函數執行結束後,系統調用析構函數撤銷對象。
  2. 局部動態對象。程序進入作用域後,調用構造函數創建新對象,退出作用域時,調用析構函數撤銷對象。
  3. 局部靜態對象。在程序首次到達定義對象處,調用構造函數創建新對象,main()函數結束時,系統調用析構函數撤銷對象。
  4. 動態申請對象。使用new產生對象時,系統自動調用構造函數,使用delete撤銷對象時,系統自動調用析構函數。
拷貝構造函數(明天寫)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章