目录
面向过程与面向对象
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++的封装特性一部分是由类体现的,主要是类将数据与操作数据的方法结合,访问限定符决定留下交互接口。
访问限定符有三种,使用时按需求。