C++类的定义与实现

一、面向对象与面向过程的区别

        举个例子,在我们完成小组任务中,一般会有两种分配任务的方法:

        (1)根据每个人(即每个对象)擅长的工作,分配相应的任务(即对象的行为);

        (2)分析出解决问题所需要的步骤,每人完成一个步骤(功能函数)。

        方法(1)就是面向对象的设计思想,将问题分解成各个对象,每个对象有确定的行为,而不是去完成一个步骤。那么方法(2)就是面向过程的设计思想,每人通过函数将实现一个步骤(因为不一定是自身擅长的,那么每个人就不重要了,重要的是每个步骤),使用的时候调用相应的功能函数即可。

        C++就是一种面向对象的语言。

二、“类”的定义与实现

1.什么是“类”

        (1)类:具有同种属性的对象。例如:

(2)类的四大特性:封装性、继承性、多态性、抽象性。

这里先讲一个封装性:一般对象都具有属性和行为。对于一个人,身高、年龄、性别是他的属性,吃饭、睡觉是他的行为,我们将一个对象的属性和方法封装在一个类,即为封装。

2.类的定义

C++中使用关键字class来定义类,以上述第二个为例,格式如下:

class Goods //类名--商品
	{
	public:  
    //公共的行为或属性,所有人都可以访问
		string Name;  //名称
	private:
    //私有的行为或属性,只能该类内部访问
		int Amount;   //数量
		float Price;  //单价
	protected:
    //被保护的行为或属性,不能被外界访问,但是能被子类直接访问
    //子类:继承了父类的属性和方法,也可以添加自己的属性的方法,后面会讲哦~
		float Total;  //总价
	};

说明:

   (1)类名、属性名在命名时尽量见名知意。

 (2)花括号中的部分称为类体,类体中定义了类的属性。

   (3)访问限定符有三种: public(公共的), private(私有的)和protected(保护的)。只有public说明的成员能从外部进行访问,每种说明符可在类体中使用多次。

   (4)访问说明符 private和 protected 体现了类具有封装性。

   (5)切记花括号后面的分号不能省略。

3.类的实现

类的实现有两种方法:(1)成员函数在类体内定义;(2)成员函数在类体内声明,类外定义。

(1)在类体内定义方法,格式如下:

#include<iostream>
#include<string>
using namespace std;
class Goods
	{
	private:
		string Name;
		int Amount;
		float Price;
		float Total;
	public:
		void RegisterGoods(const string& name, int num, float price)  //初始化数据
		{
			Name = name;
			Amount = num;
			Price = price;
			CountTotal();
		}
		void CountTotal()        //计算商品总价值 
		{
			Total = Amount * Price;
		}
		string GetName()           //读取商品名 
	    {
		    return Name;
	    }
    };

int main()
	{
		Goods book; //用定义好的类创建了一个对象 book
		book.RegisterGoods("父与子 ", 20, 25.5f); //初始化book的属性
		cout << book.GetName() << endl; //输出book的名称
	}

说明:在类内直接定义成员函数,在编译阶段编译器会默认其为inline(内联)型函数。

(2)在类体内声明,类外定义,格式如下:

#include<iostream>
#include<string>
using namespace std;
class Goods
{
private:
	string Name;
	int Amount;
	float Price;
	float Total;
public:
	void RegisterGoods(const string&, int, float);	//声明可以给形参,可以不给
	void CountTotal();
	float GetTotal();
};

//在类外定义需要加作用域解析符
void Goods::RegisterGoods(const string& name, int num, float price)
{
	Name = name;
	Amount = num;
	Price = price;
	CountTotal();
}
void Goods::CountTotal()
{
	Total = Amount * Price;
}
float Goods::GetTotal()
{
	return Total;
}

int main()
{
	Goods book; //用定义好的类创建了一个对象 book
	book.RegisterGoods("父与子 ", 20, 25.5f); //初始化book的属性
	cout << book.GetTotal() << endl; //510
}

说明:

(1)运算符 “::”: 作用域解析符 ,它指出该函数是属于哪一个类的成员函数。
    
返回类型 类名:: 函数名(方法名)
{
  函数体;
}

(2)在类外定义时,函数的返回类型、函数名、参数列表都应与类内声明一致(类内声明时可以不定义形参)。

三、this指针

有下面一个例子:

#include<iostream>
#include<string>
using namespace std;
class Goods
{
private:
	string Name;
	int Amount;
	float Price;
	float Total;
public:
	void RegisterGoods(string&, int, float); //初始化数据
	void CountTotal(); //计算商品总价值
	float GetTotal(); //读取商品总价值
};

void Goods::RegisterGoods(string name, int amount, float price)
{
	Name = name; 
	Amount = amount;
	Price = price;
}
void Goods::CountTotal()
{
	Total= Price * Amount;
}
float Goods::GetTotal()
{
	return Total;
}

int main()
{
	Goods book, pen;
	book.RegisterGoods("book", 12, 10.5);
	book.CountTotal();
	cout << book.GetTotal() << endl; //126
	pen.RegisterGoods("pen", 20, 7.5);
	pen.CountTotal();
	cout << pen.GetTotal() << endl;  //150
	return 0;
}
当book.RegisterGoods("book", 12, 10.5)和pen.RegisterGoods("pen", 20, 7.5)时,RegisterGoods函数是怎样知道处理的是book还是pen的数据呢?

this指针:

编译器针对程序员自己设计的类型分三次编译。
第一:识别和记录类体中属性的名称、类型和访问限定,与属性在类体中的位置无关。
第二:识别和记录类体中函数原型(返回类型 + 函数名 + 参数列表)、形参的默认值、访问限定,不识别函数体。
第三:改写在类中定义函数的参数列表和函数体,改写对象调用成员函数的形式。
举例:
#include<iostream>
#include<string>
using namespace std;
class Goods
{
private:
	string Name;
	int Amount;
	float Price;
	float Total;
public:
	//void RegisterGoods(Goods* this,string&,int,float);
	void RegisterGoods(string&, int, float); //初始化数据
	//void CountTotal(Goods* this);
	void CountTotal();                       //计算商品总价值
	//float GetTotal(Goods* this);
	float GetTotal();                        //读取商品总价值
};

//void RegisterGoods(Goods* this,string&,int,float);
void Goods::RegisterGoods(string name, int amount, float price)
{
	Name = name;       //this->Name = name;
	Amount = amount;   //this->Amount = amount;
	Price = price;     //this->Price = price;
}

//void CountTotal(Goods* this);
void Goods::CountTotal()
{
//this->Total = this->Amount * this->Price;
	Total= Price * Amount;
}

//float GetTotal(Goods* this);
float Goods::GetTotal()
{
	return Total;
	//return this->Total;
}

int main()
{
	Goods book, pen;
	book.RegisterGoods("book", 12, 10.5);
	book.CountTotal();               //CountTotal(&book);
	cout << book.GetTotal() << endl; //126
	pen.RegisterGoods("pen", 20, 7.5);
	pen.CountTotal();				 //CountTotal(&pen);
	cout << pen.GetTotal() << endl;  //150
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值