C語言到C++ 物件和類的進一步學習1
阿新 • • 發佈:2018-11-15
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;
}