1. 程式人生 > >C++:初識類與物件

C++:初識類與物件

在C++中,結構體不僅可以定義變數時也可以定義函式。

一.類的引入

struct student
{
	int _age;
	char _name[20];
	char _gender[3];
	void init(int age, char* name, char* gender)
	{
		_age = age;
		strcpy(_name, name);
		strcpy(_gender, gender);
	}
};
int main()
{
	student s;
	s.init(18, "張三", "男");
	system("pause");
	return 0;
}

同樣的結構體C++中,將會用class代替struct;

二.類的定義

class student
{
	//成員函式
        //成員變數
};

類的兩中定義方式:

1.宣告和定義都在類體中

class student
{
public:
	void init(int age, char* name, char* gender)
	{
		_age = age;
		strcpy(_name, name);
		strcpy(_gender, gender);
	}
private:
	int _age;
	char _name[20];
	char _gender[3];
};

2.宣告放在.h檔案中,定義放在.cpp檔案中

三.類的訪問限定符

三個限定符:public(公有),private(私有),protected(保護)

【訪問限定符說明】
(1) public成員在類外可以直接訪問;

(2)protected和private成員在類外(在此可將protected和private理解成private)不能夠訪問

(3)它們的作用域從該訪問限定符出現的位置開始直到下一個訪問限定符出現時為止

(4) class的體中如何沒有定義限定符,則預設訪問許可權是private 5. struct為public型(因為struct要相容C)
 

四.類的作用域

1.類定義了一個新的作用域,類的所有成員都必須處在類的作用域中。

2.在類體外定義成員,需要使用 :: 作用域解析符指明成員屬於哪個類域。

3.在類的作用域外,只能夠通過物件(或指標)藉助成員訪問操作符.和->來訪問類成員

4.類中的成員在類中具有全域性性。

 

namespace N1
{
	int a = 10;
}
int a = 20;
class test
{
public:
	void init(int a)
	{
		_a = a;
	}
	void print()
	{
		cout << _a << endl;
	}
private:
	int _a;      //成員變數在類中具有全域性作用
};域
int main()
{
	cout << N1::a << endl; //10
	cout << a << endl;     //20
	test b;
	b.init(30);
	b.print();             //30

	test* c = &b;
	c->init(40);
	c->print();            //40
	system("pause");
	return 0;
}

 

五.類的例項化

用類型別建立物件的過程,就是類的例項化。

程式碼舉例子:

class student
{
public:
	void init(int age, char* name, char* gender)
	{
		_age = age;
		strcpy(_name, name);
		strcpy(_gender, gender);
	}
	void print()
	{
		cout << _name << _gender << _age << endl;
	}
public:
	int _age;
	char *_name;
	char *_gender;
};
void test()
{
	student stu;
	stu._age = 10;
	stu._name = "張三";
	stu._gender = "男";
}

六.類的大小的計算

1.類中有變數也有函式,那麼如何表示出一個類的大小呢?

看程式碼:

class a1
{
public:
	void test()
	{

	}
	void test1()
	{

	}
private:
	int _a;
};
class a2
{
	void test()
	{

	}
	void test1()
	{

	}
};
class a3
{

};
int main()
{
	cout << sizeof(a1) << endl;
	cout << sizeof(a2) << endl;
	cout << sizeof(a3) << endl;
	system("pause");
	return 0;
}

根據程式碼顯示的內容

類的大小其實就是類中成員函式之和,需要記憶體對齊。

結構體記憶體對齊的相關知識,點選連結:https://blog.csdn.net/oldwang1999/article/details/80460134

空類的大小為1.1.

2.類物件的儲存模型

六.this指標

我們先寫一個日期類:

class  Date
{
public:
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << _year << " " << _month << " " << _day << " " << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1(2018, 10, 26);
	Date d2(d1);
	Date d3 = d1;
	d1.print();
	d2.print();
	d3.print();
	system("pause");
	return 0;
}

1. 每個成員函式都有一個指標形參,它的名字是固定的,稱為this指標,this指標是隱式的。

2. 編譯器會對成員函式進行處理,在物件呼叫成員函式時,物件地址作實參傳遞給成員函式的第一個形參this指 針。

3. this指標是成員函式隱含指標形參,是編譯器自己處理的,我們不能在成員函式的形參中新增this指標的引數 定義,也不能在呼叫時 顯示傳遞物件的地址給this指標。