C++学习 18-11-23

C++学习 18-11-23

1.常量成员(const成员)

1.在公有属性中定义一个 const int m_age;(常量成员),则一定需要在初始化列表中初始化。

class CPerson
{
private:
	const int n_age;								// 常量成员,一定要在初始化列表中初始化
	int n_name;

public:
	CPerson():n_age(123), n_name(100)				// 初始化列表
	{

	}
};

2.常量函数(const函数)

1.不能修改类中的成员属性

class CPerson
{
private:
	const int n_age;								// 常量成员,一定要在初始化列表中初始化
	int n_name;

public:
	CPerson():n_age(123), n_name(100)				// 初始化列表
	{

	}

public:
	void Show()
	{
		n_name++;
	}

	void ConstShow() const							// 常函数,不能修改类中的成员属性,因为this已经变为了const
	{
		n_name++;
	}
};

3.常量对象(const对象)

1.只能使用常函数,普通函数不能调用。

class CPerson
{
private:
	const int n_age;								// 常量成员,一定要在初始化列表中初始化
	int n_name;

public:
	CPerson():n_age(123), n_name(100)				// 初始化列表,常量成员必须在此处初始化,普通成员可以在此处,也可以在构造函数里
	{

	}

public:
	void Show()
	{
		n_name++;
	}

	void ConstShow() const							// 常函数,不能修改类中的成员属性,因为this已经变为了const
	{
		n_name++;
	}
};

int main()
{
	CPerson ps1;
	ps1.Show();
	ps1.ConstShow();							// 会出错,不可调用

	const CPerson ps2;
	ps2.Show();									// 会出错,不可调用
	ps2.ConstShow();

	system("pause");
	return 0;
}

4.安全性只能升级,不能降级

1.可以进行下列操作

int a = 100;
const int *p1 = &a;

// 以下程序是错误的
const int b = 120;
int *p2 = &b;

5.类之间的关系

1.创建一个建模项目->UML类图。

这种类图是用来直观的表示程序中各个类之间的关系的图。

2.类之间的关系分为两大类: 横向关系和纵向关系

纵向关系就是继承关系,它的概念非常明确,也成为面向对象编程的三个重要特征之一。
横向关系较为微妙,按照UML的建议大体上可以分为四种:
1.依赖    (Dependency)
2.关联    (Association)
3.聚合    (Aggregation)
4.组合    (Composition)
它们的强弱关系是没有异议的:依赖 < 关联 < 聚合 < 组合

3.创建一个组合关系的类

1.首先定义一个CPerson类,该类可以完成PersonSay()函数,这个函数是由两个对象的函数组成;
2.定义一个CHead类,该类完成的是PersonSay()函数中的一个对象的函数调用;
3.定义一个CHand类,该类完成的是PersonSay()函数中的另一个对象的函数调用;
4.在这个过程当中,CHead类与CHand类的关系就是组合关系。

class CHead
{
public:
	void Say()
	{
		cout << "Head Mouth Say!" << endl;
	}	
};

class CHand
{
public:
	void HandMove()
	{
		cout << "Hand Move!" << endl;
	}
};

class CPerson
{
private:
	CHead ps_head;
	CHand ps_hand;

public:
	CPerson()
	{

	}

public:
	void PersonSay()
	{
		ps_head.HeadSay();
		ps_hand.HandMove();
	}

};

int main()
{
	CPerson ps1;
	ps1.PersonSay();



	system("pause");
	return 0;
}

4.定义一个依赖关系

1.首先定义一个CComputer类,这个类中可以实现Code函数;
2.其次在CPerson类中定义一个Coding函数,传入CComputer类对象的引用,并在其中调用该对象的Code函数。

class CComputer
{
public:
	void Code()
	{
		cout << "码代码..." << endl;
	}
};

class CPerson
{
private:
	

public:
	CPerson()
	{

	}

public:
	void Coding(CComputer& cp)
	{
		cp.Code();
	}

};

int main()
{
	CPerson ps1;
	ps1.Coding();



	system("pause");
	return 0;
}

5.定义一个关联关系类

1.首先需要理解什么是关联关系,所谓关联就是某个对象会长期的持有另一个对象的引用,而二者的关联往往也是相互的。关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解除关系或是进行关联,它们在生命期问题上没有任何约定。被关联的对象还可以再被别的对象关联,所以关联是可以共享的。
2.创建一个朋友CFriend类,其中包括friend的人品,人品大于等于5则可以交朋友。

#include<iostream>
#include<time.h>

using namespace std;

class CFriend
{
public:
	int f_rp;

public:
	CFriend()
	{
		f_rp = rand() % 10;
	}

public:
	void PlayTogether()
	{
		cout << "爸爸带你飞..." << endl;
	}
};

class CPerson
{
private:
	CFriend *p_friend;

public:
	CPerson()
	{
		p_friend = 0;
	}

public:
	void FindFriend(CFriend *one_friend)
	{
		if(one_friend->f_rp >= 5)
		{
			p_friend = one_friend;
		}
	}

	void LOL()
	{
		if(p_friend)
		{
			p_friend->PlayTogether();
		}
		else
		{
			cout << "孤独..." << endl;
		}
	}

};

int main()
{
	srand((unsigned int)time(0));

	CFriend new_friend;

	CPerson ps1;
	ps1.FindFriend(&new_friend);
	ps1.LOL();


	system("pause");
	return 0;
}

6.定义一个聚合类

class CPerson
{
private:

public:
	CPerson()
	{
		
	}

public:
	

};

class CFamily
{
private:
	CPerson *p_family[10];

public:
	CFamily()				// 初始化家庭指针数组为空(每个元素都为0)
	{
		for(int i=0; i<10; i++)
		{
			p_family[i] = 0;
		}
	}

public:
	void PushPerson(CPerson *person)
	{
		int count = 0;
		while(p_family[count])
		{
			count++;
		}

		p_family[count] = person;
	}
};

int main()
{
	CPerson ps1;

	CFamily family;
	family.PushPerson(&ps1);




	system("pause");
	return 0;
}

7.依赖关系和关联关系没有生命周期,组合关系和聚合关系是有生命周期的。

7.整体程序

#include <iostream>
#include <time.h>
#include <string>

using namespace std;

class CHead
{
private:

public:
	void HeadSay()
	{
		cout << "HeadSay" << endl;
	}
};

class CHand
{
private:

public:
	void HandMove()
	{
		cout << "HandMove" << endl;
	}
};

// 定义一个与CPerson呈依赖关系的CComputer类
class CComputer
{
public:
	void Code()
	{
		cout << "码代码...." << endl;
	}
};

// 定义一个关联类
class CFriend
{
public:
	int f_rp;

public:
	CFriend()
	{
		f_rp = 10;
	}

public:
	void PlayTogher()
	{
		cout << "爸爸带你飞" << endl;
	}
};

class CPerson
{
private:
	CHead head;
	CHand hand;
	CFriend *p_friend;

public:
	CPerson()
	{
		p_friend = 0;
	}

	
public:
	void FindFriend(CFriend *one_friend)
	{
		if(one_friend->f_rp >= 5)
			p_friend = one_friend;
	}

	void Play()
	{
		if(p_friend)
			p_friend->PlayTogher();
		else
		{
			cout << "我自己飞" << endl;
		}
	}

	void PersonSay()
	{
		head.HeadSay();
		hand.HandMove();
	}

	void Coding(CComputer& cp)
	{
		cp.Code();
		cout << "掉头发....." <<endl;
	}
};

// 定义一个与CPerson是聚合关系的类
class CFamily
{
public:
	CPerson *p_family[10];

public:
	CFamily()
	{
		for(int i=0; i<10; i++)
			p_family[i] = 0;
	}

public:
	void PushPerson(CPerson *person)
	{
		int i = 0;
		while (p_family[i])
		{
			i++;
		}
		p_family[i] = person;
	}

	void AllFamilyCoding(CComputer& cp)
	{
		int i = 0;
		while (p_family[i])
		{
			p_family[i]->Coding(cp);
			i++;
		}
	}

};

int main()
{
	srand((unsigned int)time(0));

	CComputer cp;
	CFriend one_friend;

	CPerson ps1;
	ps1.PersonSay();
	ps1.Coding(cp);
	ps1.FindFriend(&one_friend);
	ps1.Play();


	// 测试CFamily类
	CFamily c_family;
	c_family.PushPerson(&ps1);
	c_family.AllFamilyCoding(cp);

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42896619/article/details/84853912