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

 

猜你喜欢

转载自blog.csdn.net/qq_36795563/article/details/81434340