C++基础之类一(面向对象,类的定义,类的作用域)

目录

面向过程与面向对象

类的定义

类的格式

类的定义方式

类域内部定义

类域外部定义

封装

封装的概念

访问限定符

类域

封装的实现


面向过程与面向对象

C++与C语言不同,C语言是面向过程的,也就是说C语言着重于程序运行的每一步,举个例子,炒菜,在面向过程的角度看,分为后续几步,放锅,点火,放油,加入调料,放菜,翻炒,放盐,初出锅等等,面向对象则是换了一个思路,将炒菜的事情分为几个对象,锅,炉具,调料,菜,炒菜的人,通过对象之间的相互交互,最终炒出菜,简单地说,面向对象的C++关注的更多的是程序完成过程中的对象。

类的定义

从类开始学习C++,是因为类很好的体现了C++的面向对象的特性,类是C语言的struct升级版本,除了包含程序所需的成员变量外,还增加了该成员的成员函数,实现了一个完整的对象。

类的格式

calss ClassName
{


};

 以上就是类的格式,class是类的类型,ClassName是类名,{        }内部是类体,其中包含该类的成员函数以及成员变量,最后必须使用;结尾,类可以定义在任何地方,通常定义在头文件中(实现过程中发现,目前类只有在头文件中定义才能使用类外定义成员函数,如果放在函数中定义,则成员函数必须在类中定义)

类的定义方式

需要注意类的定义并不是创造了类的实体,而是定义类的图纸,创造实体时按照图纸进行创建。

类域内部定义(内联)

class Cla
	{
	public:
		void _init(int X = 4)
		{
			_date = (DateType*)malloc(sizeof(DateType)*X);
			assert(_date);
			_top = 0;
			_capacity = X;
		};
		void _push(DateType X)
		{
			assert(_date);
			_checkcapacity();
			_date[_top++] = X;
		};
	private:
		DateType* _date;
		int _top;
		int _capacity;
		void _checkcapacity()
		{
			assert(_date);
			if (_top == _capacity)
			{
				DateType*_newdate = (DateType*)realloc(_date, sizeof(DateType)*(_capacity * 2));
				if (_newdate == nullptr)
				{
					perror("realloc fail!");
					exit(-1);
				}
				_capacity = _capacity * 2;
			}
		}
	};

上面这种将成员函数的声明和定义全部放在类中的方式,不便于阅读,但这种定义方式的特点在于,定义的成员变量默认为内联函数。

类域外部定义(非内联)

这种方式,通常将类定义在.h文件中,在类中只声明成员函数,成员函数的具体实现,放在类的碗面,这种方式类的成员简单清晰,更适合阅读

1。类的格式
class Cla
{
public:
	void _init(int X = 4);
	void _push(DateType X);
private:
	DateType* _date;
	int _top;
	int _capacity;
	void _checkcapacity();
};


void Cla::_init(int X)
{
	_date = (DateType*)malloc(sizeof(DateType)*X);
	assert(_date);
	_top = 0;
	_capacity = X;
};

void Cla::_push(DateType X)
{
	assert(_date);
	_checkcapacity();
	_date[_top++] = X;
}

void Cla::_checkcapacity()
{
	assert(_date);
	if (_top == _capacity)
	{
		DateType*_newdate = (DateType*)realloc(_date, sizeof(DateType)*(_capacity * 2));
		if (_newdate == nullptr)
		{
			perror("realloc fail!");
			exit(-1);
		}
		_capacity = _capacity * 2;
	}
}

封装

封装的概念

封装是一种管理行为,通过将数据与方法结合,隐藏对象的属性与细节,只留下被选择的接口与使用人员交互,可以保护数据不被篡改。

访问限定符

访问限定符是实现封装的主要方式,通过访问限定符可以控制接口能否与外部交互(这里的交互是指与类的外部发生交互,在类的内部不需要考虑访问限定符):

名称作用
public公有(与类的外部进行交互,一般函数使用)
private私有(不与类的外部进行交互)
protected保护(不与类的外部进行交互)

访问限定符的作用范围从该限定符出现开始,直到遇见下个限定符结束,如果没有下个限定符,那么会直到类结束。

关于访问限定符的说明:

1、public可以直接被类的外部访问

2、private和protected不能被类的外部访问

3、访问限定符的作用范围,从该访问限定符开始,直到下个出现的访问限定符时结束

4、如果后面没有出现新的访问限定符,那么该访问限定符的范围直到类结束

5、class默认的访问限定符是private,struct默认的访问限定符是public,这是为了兼容C语言 

类域

类域是创建类时的虚拟域,类体中的所有成员都属于类域,需要注意,类域时虚拟的类似于一张图纸不是实体,所以创建类不等于将类的对象实例化,同时类域与命名空间域有很大的区别。

命名空间中的变量是实体,是全局变量,在程序的任何地方都可以调用。

namespace bit
{
	int a = 10;
	double b = 20.0;
}


int main()
{
	std::cout << bit::a << std::endl;
	system("pause");
	return 0;
}

类体中的变量不是实体(可以在创建类时给成员变量赋值),但只创建类后无法使用,需要将其实例化后才能使用。

class bit
{
public:
	int a = 10;
	double b = 20.0;
};
int main()
{
	bit X;
	std::cout << X.a << std::endl;
	system("pause");
	return 0;
}

类不能使用作用域限定符::直接访问,作用域限定符是类的外部定义类的成员函数时使用。

封装的实现

按照封装的概念,将数据与操作数据的方法结合起来,只留下选择后的接口,通过接口与外界进行交互,C++中的封装通过类与访问限定符来实现,类将成员变量与成员方法结合,访问限定符决定与外部交互的接口。

总结

类是体现C++封装特性的自定义类型,它的代码结构与结构体相似,不同之处在C++的类默认访问限定符是private,结构体的默认访问限定符是public,类的定义有两种方式,一种是成员函数与成员变量全部在类的内部定义,这种方式成员函数具有内联效果,但是阅读不方便,另一种方式是成员函数只在类中声明,在类的外部定义,这种方式方便阅读,定义时需要注意使用作用域限定符。

C++的封装特性一部分是由类体现的,主要是类将数据与操作数据的方法结合,访问限定符决定留下交互接口。

访问限定符有三种,使用时按需求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值