1. 程式人生 > >C語言到C++ 物件和類的進一步學習1

C語言到C++ 物件和類的進一步學習1

1.物件生命週期

#include <iostream>
using namespace std;

class Test
{
public:
	Test()	//建構函式     無返回值
	{
		cout << "建構函式 物件建立" << endl;
	}
	~Test()	//解構函式    無引數 無返回值
	{
		cout << "解構函式 物件生命週期結束" << endl;
	}

private:
protected:
};

//函式呼叫 研究物件的行為
void objplay()
{
	Test t1;
}

int main01()
{
	objplay();	//研究物件的行為

	system("pause");
	return 0;
}

 

2.建構函式的分類

#include <iostream>

using namespace std;

//類沒有提供建構函式  編譯器會提供一個預設的建構函式
//當沒有定義賦值建構函式時 編譯器會提供一個預設的賦值建構函式
//一旦定義了建構函式 編譯器不會提供無參構成函式
//在定義類 只要寫了建構函式,就必須要用

//如果宣告一個類物件陣列 
//建構函式的優勢就體現出來了

class Test2
{
public:
	Test2()
	{
		cout << "無引數建構函式" << endl;
	}
	Test2(int m_a,int m_b)
	{
		a = m_a;
		b = m_b;
		cout << "有引數建構函式" << endl;
	}
	//賦值建構函式(copy建構函式)
	Test2(const Test2 & t1)
	{
		cout << "賦值建構函式" << endl;
	}

private:
	int  a;
	int  b;
protected:
};


//建構函式的三種方法
int main02()
{
	Test2 t1;		//1無參建構函式呼叫
	Test2 t2(5,6);	//2括號法,有引數建構函式

	//Test2 t3 = (4,5);	
	//等號法,(4,5)中是逗號表示式 值為5 適合一個引數的建構函式
	//C++對等號進行了功能增強

	//3直接呼叫建構函式 不呼叫自己內部的建構函式
	Test2 t4 = Test2(2,3); //將產生匿名物件

	//t4 = t1;	//把t1的值賦值給t4
	//物件的初始化 和物件的賦值是兩個不同概念

	system("pause");
	return 0;	
}

3.賦值建構函式的呼叫1

 

#include <iostream>

using namespace std;

class Test4
{
public:
	Test4()
	{
		cout << "無引數建構函式" << endl;
	}
	Test4(int m_a, int m_b)
	{
		a = m_a;
		b = m_b;
		cout << "有引數建構函式" << endl;
	}
	//賦值建構函式(copy建構函式)
	Test4(const Test4 & t1)
	{
		cout << "賦值建構函式" << endl;
		a = t1.a;
		b = t1.b;
	}

public:
	int getA()
	{
		return a;
	}
	int getB()
	{
		return b;
	}

private:
	int  a;
	int  b;
protected:
};



int main03()
{
	Test4 t0(1, 2);
	Test4 t1(12,22);
	Test4 t2(t1);	//用t1物件初始化t2物件

	//Test4 t2 = t1;	//用t1初始化t2
	//t0 = t1;		//賦值和初始化是兩個不同概念
	//賦值 不會呼叫建構函式

	cout << "t2 " << t2.getA() << endl;


	system("pause");
	return 0;
}

 

4.賦值建構函式的呼叫2

#include <iostream>

using namespace std;

class Test5
{
public:
	Test5()
	{
		cout << "無引數建構函式" << endl;
	}
	Test5(int m_a, int m_b)
	{
		a = m_a;
		b = m_b;
		cout << "有引數建構函式" << endl;
	}
	//賦值建構函式(copy建構函式)
	Test5(const Test5 & t1)
	{
		cout << "賦值建構函式" << endl;
		a = t1.a;
		b = t1.b;
	}

public:
	int getA()
	{
		return a;
	}
	int getB()
	{
		return b;
	}

private:
	int  a;
	int  b;
protected:
};

//形參是一個元素
void f(Test5 p)
{
	cout << "顯示a:" << p.getA() << endl;
}


void playobj()
{
	Test5 t1(1,2);
	Test5 t2 = t1;
	f(t2); //t2實參取初始化形參p,會呼叫賦值建構函式

}

int main04()
{

	playobj();

	system("pause");
	return 0;
}

 

5.賦值建構函式的呼叫3

#include <iostream>

using namespace std;

class Test6
{
public:
	Test6()
	{
		cout << "無引數建構函式" << endl;
	}
	Test6(int m_a, int m_b)
	{
		a = m_a;
		b = m_b;
		cout << "有引數建構函式" << endl;
	}
	//賦值建構函式(copy建構函式)
	Test6(const Test6 & t1)
	{
		cout << "賦值建構函式" << endl;
		a = t1.a;
		b = t1.b;
	}

public:
	int getA()
	{
		return a;
	}
	int getB()
	{
		return b;
	}

private:
	int  a;
	int  b;
protected:
};

//返回值是一個元素,返回的是一個新的匿名物件
Test6 g()
{
	Test6 t1(5,6);
	return t1;		
	//返回時 用t1物件建立了一個匿名物件
}
//匿名物件的去和留?
void objplay1()
{
	Test6 m0 = g();	//初始化,匿名物件從無名變成有名m 
					//不會被析構掉
}
void objplay2()
{
	Test6 m0(1,2);	
	m0 = g();	//賦值,此時匿名物件會被析構
}
int main05()
{
	objplay1();
	objplay2();	//匿名物件的去和留
	
	system("pause");
	return 0;
}