『C++学习录』类与对象

楔子:D

七月燃尽了
要花枝招展地丰富起来!

在这里插入图片描述

类与对象

类与对象A

一、OOP基本手段

1.抽象

属性抽象——类中的数据成员

行为(操作)抽象——类中的成员函数

封装(定义class)产生类,类实例化产生类的实体——对象

2.封装

属性

方法——接口

class Clock
{
//外部接口
public:
	void SetTime(int NewHour,int NewMin,int NewSec);//成员函数
	void ShowTime(void);//成员函数
//内部属性
private:
	int Hour;//成员变量
	int Minute;//成员变量
	int Second;//成员变量
//内部行为
	void Run(void);//成员函数
};

3.继承与派生

支持分类层次,定义新的类

继承通过派生来实现

4.多态性

类的派生过程,允许不同派生类对同一个操作有不同行为实现

虚函数与重写函数(override)实现

类与对象B

二、类

1.类的声明形式

(类似struct)

class name

{

public:

private:

protected:

}

2.类成员的访问类型

1)public

定义类的外部接口

2)private

定义内部数据和代码实现

#无关键字声明时,class内的成员都是Private类型

3)protected

本类或派生类对象成员函数被访问,不允许外部访问

3.类的定义

void Clock :: SetTime()

{

}

void Clock :: ShowTime()

{

}

4.类成员的定义

内联成员函数在编译时不再控制转移

class Point
{
	public:
		void Init(int initX,int initY)
		{
			X = initX;
			Y = initY;
		};
		int GetX(){return X};
		int GetY(){return Y};
	private:
		int X,Y;
}
/*-----------------------------------------------------------------------------------------------*/
class Point
{
	public:
		void Init(int initX,int initY);
		int GetX();
		int GetY();
	private:
		int X,Y;	
}

inline void Point :: Init(int initX,int initY)
		{
			X = initX;
			Y = initY;
		}
inline int Point :: GetX()
{
	return X;
}
inline int Point :: GetY()
{
	return Y;
}

5.对象

1)声明形式

类名 对象名

Clock MyClock

2)对象成员的访问方式

对象名.成员名

MyClock.ShowTime();//访问成员函数

MyClock.Hour = 12;//访问成员函数(公有类型才可以直接访问)

#Attention

1)从类的外部访问,受到访问类型限制(public/private/protected)

2)从同一个对象的成员函数访问本对象成员,可以省略对象名,直接采用成员名

6.类中的自引用

关键字this:指向被调用的对象的指针

this是类成员函数的一个隐含参数

7.类的概念结构

c++类是定义抽象数据结构

数据+方法

属于一个类的所有实例(对象)有相同的结构

调用一个对象的方法,操作访问目标为本对象的数据成员。(this)

类与对象C

8.类的构造函数

构造函数:对象数据初始化

构造函数没有返回值(不是返回void)

1)构造函数
class Clock
{
public:
	Clock(int Hour,int Min,int Sec);//构造函数,与类的名字相同,无返回值
	...
private:
	int Hour,int Minute,int Second;
};

//构造函数无返回值
Clock::Clock(int Hour,int Min,int Sec)//类的名字(Clock)+限定符(::)+构造函数名字(Clock)
{
	this->Hour = Hour;//私有成员进行初始化赋值
	Minute = Min;
	Second = Sec;
}

int main()
{
	Clock MyClock(0,0,0);//调用构造函数,初始化MyClock
	MyClock.ShowTime();
	return 0;	
}
2)构造函数的重载
class Clock
{
public:
	Clock();//无参数的构造函数
	Clock(int Hour,int Min,int Sec);//构造函数,与类的名字相同,无返回值
	...
private:
	int Hour,int Minute,int Second;
};

//构造函数
Clock::Clock()
{
	Hour = Minute = Second = 0;
}

//构造函数无返回值
Clock::Clock(int Hour,int Min,int Sec)//类的名字(Clock)+限定符(::)+构造函数名字(Clock)
{
	this->Hour = Hour;//私有成员进行初始化赋值
	Minute = Min;
	Second = Sec;
}

int main()
{
	Clock MyClock(0,0,0);//调用第二个构造函数,初始化MyClock
	Clock MyClock2;//调用第一个无参数的构造函数
	return 0;	
}
3)拷贝构造函数

a)形参为本类对象的引用

class 类名

{
public:
	类名(类名&对象名);
	...
}

b)拷贝构造函数的引用

缺省拷贝构造函数(未声明编译器自动生成)

...
Point::Point(Point& p)//拷贝构造函数
{
	X = p.x;
	Y = p.y;
	cout<<"Copy Constructor"<<endl;
}

void func1(Point p)
{
	cout<<p.GetX()<<endl;
}

Point func2()
{
		Point A(1,2);
		return A;//函数返回值是类对象,调用拷贝构造函数
}//函数结束时A生命期结束,但系统会产生临时对象以供后续调用,之后再释放掉

int main()
{
	Point A(1,2);//初始化
	Point B(A);//对象A初始化B,调用拷贝构造函数
	func1(A);//类对象作为函数形参,调用拷贝构造函数
	Point C = func2();//函数返回值为类对象,调用拷贝构造函数
}

9.析构函数

对象被删除/生命期结束前调用该函数

形式:~类名();

...
class DataFile
{
	private:
		File * fPtr;
		char * FileBuf;
	public:
		DataFile(char * FileName);//构造函数
		DataFile(DataFile& DF);//拷贝构造函数
		~DataFile();//析构函数
//其他函数
	void ReadFile();
	...
}
//构造函数
DataFile::DataFile(char * FileName)
{
	fPtr = fopen(FileName,"rb");
	FileBuf = new char [BUF_SIZE];
}
//拷贝构造函数
DataFile::DataFile(DataFile& DF)
{
	fPtr = DF.fPtr;
	FileBuf = new char [BUF_SIZE];
}
//析构函数
DataFile::~DataFile()
{
	fclose(fPtr);
	delete [] FileBuf;
}
#define MAX_STR_LEN 1024
class CMyString
{
private:
	int iStrLen;
	char * pStrBuf;
	...
public:
	CMyString();
	CMyString(char * pStr);
	~CMyString();
	
	CopyString(char * pSource);
};
CMyString::CMyString():iStrLen(0)//函数不带参数,参数列表
{
	pStrLen = new char[MAX_STR_LEN];
	pStrLen[0] = 0;
}
CMyString::CMyString(char * pStr)
{
	pStrLen = new char[MAX_STR_LEN];
	CopyString(pStr);
}
CMyString::CopyString(char * pSource)
{
	::strcpy(pStrBuf,pSource);
	iStrLen = ::strlen(pSource);
}
CMyString::~CMyString()//析构函数
{
	delete [] pStrLen;
}

10.类的组合

一个类内嵌其他类的对象作为成员

1)组合类(包含与被包含)
class Point
{

}

class Line
{
private:
	Point p1,p2;//两个端点
public:
	Line(Point a,Point b);//构造函数
	
	void Draw(void);//画线段
};
2)类组合的构造函数

声明形式

类名::类名(参数表)
	:成员(初始化参数),成员(初始化参数),...
{
	本类初始化
}
//对p1p2调用默认构造函数Point()
Line::Line()
{
...
}
//对p1调用构造函数Point(h,v),对p2调用默认构造函数Point()
Line::Line(int x1,int y1) : p1(x1,y1)
{
...
}
//对p1p2调用构造函数Point(h,v),用w初始化成员width
Line::Line(int x1,int y1,int x2,int y2,int w)
:p1(x1,y1),p2(x2,y2),width(w)
{
...
}
//对p1p2调用构造函数Point(p)
Line::Line(Point a,Point b,int w)
:p1(a),p2(b),width(w)
{
...
}

尾巴:D

不要怠惰不要怠惰!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值