一、面向对象
面向对象编程是软件工程范式的一种重大演进,虽然在现在已经是一种普遍的开发方式,但在当初可是开发思想的巨变。面向对象重点是从思想角度把开发从整体迁移到了对象上即以对象为基础进行整个编程体系的构造。
二、C++中的对象
既然是以对象为基础,什么是对象就必须搞明白。如果光从教科书的定义上来看,对象非常好理解,很多人可能冲口而出,就是类的实例么。没错,但是如何更宽泛的定义呢?可以这样理解:对象是抽象的具体。回头再来看刚刚的回答,类就是抽象,对象就是抽象的一个具体实例。
如果从物理意义上定义对象,它其实就是内存中一块数据集合的统称,它包含有一系列的函数、属性等可操作的方法。
对象一般包含几个特征:状态(对象的属性内容),方法(对象的可操作性)和ID(对象的地址标志)。它们三个一起组成了对象的基本的内容。
三、分析
如果单纯从理论上分析,对象并没有什么可细读的东西。但从抽象到具体,总需要有一个例子来说明会更容易理解。比如讲驾驶的各种方法和技巧,最终还是要让学员亲自上车实践一把更容易理解什么是加油门什么是刹车。下面就针对C++中常见的具体对象实例进行分析说明:
-
基础类型对象
这个更好理解,就是常见基础类型如int等,定义成的相关对象。这个其它语言中,更容易理解。在一些跨平台的兼容性中,也经常看到这种定义int a = 0; std::int32_t b = 0; -
数组(容器)对象
这也是一种很普遍的对象,把一个数组或一个盛纳相同数据类型的容器定义的实例称为对象int arr[10]; std::vector<int> vec; -
结构体对象
C++中的结构体对象是从C语言继承下来的,和C语言有着不少细节的不同,特别是在定义和使用时。在C++编程中,如果在仅使用纯数据操作时,一般建议还是定义结构体对象来使用struct Demo{ int i = 10; double d = 11.0 }; Demo d; -
普通类对象
这是最经典的对象,写C++不会写类那还能叫C++开发?用类就必须会有实例。这就是类对象。这里指出是普通类对象,目的就是为了和其它对象的区别,从严格意义上来讲,它们都可以说是类对象class Data{ public: Data(){}; ~Data(){}; public: void display(int d){std::cout<<"sum:"<<d+d_<<std::endl;} private: int d_ = 0; }; Data d; -
函数对象
这里是严格的函数对象范围,否则后面两个也可以划到此范围内。所谓函数对象就是将函数定义为对象的一种方法。它包括普通的函数指针对象也包括在STL中预定义的很多标准函数对象如std::function(),运算符对象等等auto sub = std::bind(std::minus<int>(), std::placeholders::_1, std::placeholders::_2); std::function<int(int, int)> mul = std::multiplies<int>();这里需要说明的是std::function配合std::bind可以实现非常强大的功能,但其也明显有些重,所以在使用时要认真对待
-
Lambda表达式对象
Lambda表达式是C++11引入的一种匿名函数对象处理的机制,其后又引入了模板泛型Lambda等。它让开发者可以更方便灵活的定义函数对象,而不用使用传统的定义声明的机制auto func = [&](int d) { return d++; }; -
仿函数对象
这其实是一种自定义运算符operator()的机制,它的优势在于可以根据需求灵活扩展相关的运算符的应用场景。对于普通函数来说,仿函数的优势是在于其内部可以进行状态的控制。从实现来讲,仿函数是Lambda实现的基础:class Sum { private: int num = 0; public: int operator()() { return ++num; } };
当然,从不同的角度来看,对象可能也有不同的定义方式。比如从生命周期、值类型种类等等。不过从上面的角度来看,更容易为初学者理解和掌握。
四、总结
人们对于身旁的一些熟悉的事物往往能够更容易理解从抽象到具体的过程。但一些无法容易物化的具体实例,往往不容易理解。这其实就需要更善于“借物比喻”来描述抽象的存在。这一点老子和庄子就非常擅长。
其实从类与对象的抽象与具体来看,难于理解的不是常见的普通类对象等,而是一些特殊的如bind,lambda等情况。特别是仿函数,看着简单,用起来很有可能一忽悠就糊涂了。


7590

被折叠的 条评论
为什么被折叠?



