⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 面向对象基础_动物运动会.cpp

📁 设计模式:工厂模式、单例模式的基本实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:



对象:
1. 一切事物皆为对象, 即所有的东西都是对象, 对象就是可以看到、感觉到、听到、触摸到、尝到或闻到的东西。
2. 对象是一个自包含的实体,用一组可识别的特性和行为来标识。

面向对象编程:
Object-Oriented Programming。是针对对象来编程的开发方式


动物运动会:






1. 实现一声猫叫:
int main()
{
	cout << "喵" << endl;
}



2. 想让猫多叫几声:
void Shout()
{
	cout << "喵" << endl;
}
int main()
{
	Shout();
}

缺点:
	好比,居委会的公用电视放在你家,而别人都没有,于是街坊邻居大都来你家看电视。

类:
	就是具有相同属性和功能的对象的抽象的集合。
注意:
	1. 类名称首字母应该大写。多个单词则各个首字母大写。
	2. 对外公开的方法需要用"public"修饰符。



3. 使用类实现猫叫:
class Cat
{
public:
	void Shout()
	{
		cout << "喵" << endl;
	}
};
int main()
{
/*
	// C++中静态创建对象
	Cat cat;
	cat.Shout();
*/
	// C++中动态创建对象
	Cat *cat = new Cat;
	cat->Shout();
	delete cat;
}

Cat 实例化后,就等同于生了一只小猫cat, 此时就可以让小猫cat->Shout()了。

实例:
	就是一个真实的对象。例如:我们都是'人',而你我其实就是'人'类的实例。
实例化:
	就是创建对象的过程。(动态使用 new 来创建)	



4. 构造函数
class Cat
{
	string name;
public:
	Cat(string name)
	{
		this->name = name;
	}
	void Shout()
	{
		cout << "我的名字叫" << name << " 喵" << endl;
	}
};
int main()
{
	// 在客户端要生成小猫时,就必须要给小猫起名字
	Cat *cat = new Cat("咪咪");
	cat->Shout();
	delete cat;
}

需求:
	希望出生的小猫有个名字,比如叫"咪咪",当咪咪叫的时候,最好能说 "我的名字叫咪咪,喵" —— 考虑使用构造函数

缺点:
	就目前的代码,当生下一个小猫时,必须给它起名字,如果没有想好名字,则不能创建对象。如果真的不需要起名字也可生出小猫来,可以使用下面的"函数重载"

构造函数:
	1. 又叫构造方法,其实就是对类进行初始化。构造函数与类名同名,无返回值,也不需要 void,在 new 是调用。
	2. 所有类都有构造函数,如果你不编写,则系统默认生成空的构造函数,如你有定义的构造函数,那么默认的构造函数就会失效。



5. 函数(方法)重载
class Cat
{
private:
	string name;
public:
	Cat()
	{
		name = "无名";
	}
	Cat(string name)
	{
		this->name = name;
	}
	void Shout()
	{
		cout << "我的名字叫" << name << " 喵" << endl;
	}
};
int main()
{
	// 不会报错,猫叫时会是"我的名字叫无名 喵"
	Cat *cat = new Cat;
	cat->Shout();
	delete cat;
}

函数重载:
	1. 两个方法的方法名必须相同,但参数类型或个数必须要有所不同,否则重载就没有意义了。
	2. 函数重载可在不改变原方法的基础上,新添加功能。(函数重载提供了函数可扩展的能力)



6. 属性操作

需求:
	小猫叫的次数太少,希望是我让它叫几声,它就叫几声?

分析:
	叫几声并不是必须要实例化的时候就声明的,我们可以在之后规定它叫几声。	

class Cat
{
	string name;
	int shoutNum;
public:
	Cat()
	{
		name = "无名";

		// 初始叫声为3
		shoutNum = 3;
	}
	Cat(string name)
	{
		this->name = name;

		// 初始叫声为3
		shoutNum = 3;
	}
	void setShoutNum(int shoutNum)
	{
		if(shoutNum <= 10)
		{
			this->shoutNum = shoutNum;
		}
		else
		{
			// 最多叫 10 声
			this->shoutNum = 10;
		}
	}
	int getShoutNum()
	{
		return shoutNum;
	}
	void Shout()
	{
		string result = "";

		for(int i=0; i<shoutNum; i++)
		{
			result += " 喵";
		}
		cout << "我的名字叫" << name << result << endl;
	}
};
int main()
{
	Cat *cat = new Cat("mimi");
	cat->setShoutNum(5);
	cat->Shout();
	delete cat;
}
public 和 private 的区别:
	1. public 表示它所修饰的类成员可以允许其它任何类来访问。
	2. private 表示只允许同一类中的成员访问,其它类包括它本身的子类无法访问。如果没有修饰符,默认是 private
	3. 通常属性都是 private ,即私有成员;方法都是 public ,即公有方法。
	4. 举例:
		类: 我们的房子,更多的是不透明的墙。
		private 成员: 房子内的东西。
		public 成员: 门和窗子,可以控制。
		如果全部都声明为 public , 相当于我们的房子是全透明的,或做了不设防的门窗。

	
命名方式:
	1. 属性名一般首字母小写或前加'_';方法名一般首字母大写

get和set方法:
	1. 属性有两个方法 get 和 set。 
	2. get 返回与声明的属性相同的数据类型,表示的意思是调用时可以得到内部字段的值、引用或指针
	3. set 一般带一个参数,其作用是调用时为内部的属性赋值。


7. 封装:
	1. 每个对象都包含它能进行操作所需要的所有信息, 这个特性称为封装, 因此对象不必依赖其它对象来完成自己的操作. 这样方法和属性包装在类中,通过类的实例来实现.

	2. 封装的好处:
		1). 良好的封装能够减少耦合. (类定义和客户端的其它程序是分开的)
		2). 类内部的实现可以自由地修改.
		3). 类具有清晰的对外接口

添加Dog类:
class Dog
{
	string name;
	int shoutNum;
public:
	Dog()
	{
		name = "无名";

		// 初始叫声为3
		shoutNum = 3;
	}
	Dog(string name)
	{
		this->name = name;

		// 初始叫声为3
		shoutNum = 3;
	}
	void setShoutNum(int shoutNum)
	{
		if(shoutNum <= 10)
		{
			this->shoutNum = shoutNum;
		}
		else
		{
			// 最多叫 10 声
			this->shoutNum = 10;
		}
	}
	int getShoutNum()
	{
		return shoutNum;
	}
	void Shout()
	{
		string result = "";

		for(int i=0; i<shoutNum; i++)
		{
			result += " 汪";
		}
		cout << "我的名字叫" << name << result << endl;
	}
};


8. 继承:
	
	1. 猫和狗都是动物,更准确说它们都是哺乳动物。
	2. 哺乳动物:胎生、哺乳、恒温
	3. 猫和狗与哺乳动物是继承关系

继承说明:
	1. 对象的继承是一种 'is-a' 的关系,如果两个对象A和B,可以描述为 'B是A',则表明B可以继承A。
	例如:
		'猫是哺乳动物',说明猫与哺乳动物之间是继承与被继承的关系。
	2. 实际上,继承者还可以理解为是对被继承者的特殊化,因为它除了具备被继承者的特性外,还具备自己独有的个性。
	例如:
		猫有可以抓老鼠,爬树等'哺乳动物'对象则不具备的属性。
	因此:在继承关系中,继承者可以完全替代被继承者,反之则不成立。
	例如:
		'哺乳动物是猫':有些莫名其妙。
	3. 继承定义了类如何相互关联,共享特性。继承的工作方式是:定义父类和子类,其中子类继承父类的所有特性。子类不但继承了父类的所有特性,还可以定义新的特性。

	4. 学好继承记住三句话:
		1). 子类拥有父类所有的属性和功能。
		2). 子类具有自己的属性和功能。
		3). 子类还可以以自己的方式实现父类的功能(方法重写)
	
	5. protected 表示继承时子类可以对基类有完全访问权。

	6. 子类从它的父类中继承的成员有:属性、方法。
		注意:对于父类的构造函数只能被调用,不能被继承。

	7. 继承的缺点是:
		1). 父类变,子类不得不变。
		2). 继承会破坏包装,父类实现细节暴露给子类,增大了两个类的耦合性(可以理解为'藕断丝连')。
			继承显然是一种类与类之间强耦合的关系。
	
	8.	当两个类之间具备'is-a'的关系时,就可以考虑用继承。表示一个类是两一个类的特殊种类。
		当两个类之间是'has-a'的关系时,表示某个角色具有某一项责任,此时不适合继承。
		例如:
			人有两只手,手不能继承人;
			飞机场有飞机,飞机不能继承飞机场。


//动物类:
class Animal
{
protected:
	string name;
	int shoutNum;
public:
	Animal()
	{
		name = "无名";
		shoutNum = 3;
	}
	Animal(string name)
	{
		this->name = name;
		shoutNum = 3;
	}
	void setShoutNum(int shoutNum)
	{
		if(shoutNum <= 10)
		{
			this->shoutNum = shoutNum;
		}
		else
		{
			this->shoutNum = 10;
		}
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -