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;
}