1. 概述

现代C++与最原始的版本已经差不多是两种不同的语言了。不断发展的C++标准给C++这门语言带来了更多的范式和特性,也造就了其非常的难度。但是从个人的体会而言,如此之多的特性没有必要一项项去硬学,很多的特性没有实际使用过,体会就不会很深。反而在学了C#,Java,JavaScript这些语言并在实际使用过之后,反而愈发理解了这些语言的编程思想。

现代C++至少有4种编程范式:面向过程、面向对象、泛型和函数式。其中面向对象是最经典的编程思想,最初的时候使用C++的面向对象,总是用成了"C With Class"风格。但是其实在Cpp11之后面向对象有一整套独特的设计,体现了C++"零成本抽象(zero overhead abstraction)"的设计哲学。

2. 详论

2.1. 类与对象

任何编程语言都有数据类型的概念,如整型、浮点型等。但是很快,有时候我们发现,全部是单个的数据类型不利于管理,所以有个自定义数据类型。例如,我想定义一个图像类型:

struct ImageEx
{
int imgWidth;
int imgHeight;
int bandCount;
};

struct最开始是C语言的定义,也就是结构体。通过这个简单的图像类型结构体,管理了图像宽、高以及波段三个参数。通过struct虽然让编程中有了一定对现实事物的抽象能力,但是这个能力是不足的。主要是缺少像函数一样的“行为”能力。而在C++中,对struct做了扩充,我们在其中加入函数来表达行为(这里通过函数DoWork()表达对图像的某种处理):

struct ImageEx
{
int imgWidth;
int imgHeight;
int bandCount; void DoWork()
{ }
};

像这样,把数据(属性)和函数(方法)合成的自定义数据结构,就是类,其具体的实例就是对象,以对象最为程序设计的基本单位就是面向对象编程。它表达了对客观事物的抽象,更接近于人的自然认知。

更多的情况下,C++的类采用class关键字。class和struct的区别在于,class定义类的数据成员和成员函数默认的访问权限是public:公有的,能被外部访问;而struct则是private:私有的,不能被外部访问。当然,我们最好明确访问权限:

class ImageEx
{
public:
void DoWork()
{ } private:
int imgWidth;
int imgHeight;
int bandCount;
};

增加访问权限控制的好处是进一步加强了类的封装性。对于任何一个类对象,用户肯定更关心其行为方法,而不是其内部属性部据。因此,通常一个比较好的实现是:方法在前,设为public,数据在后,设为private。

进一步的,如果在公有的成员函数很复杂,需要通过调用其他成员函数DoSomething()来实现,那么这个DoSomething()函数定义成公有还是私有的呢?通常来讲,可以定义成私有:

class ImageEx
{
public:
void DoWork()
{
DoSomething();
} private:
void DoSomething()
{ } int imgWidth;
int imgHeight;
int bandCount;
};

这样,通过数据抽象和封装,实现了接口与实现的分离。可以认为类的接口是类的公有成员函数,而类的数据成员、接口实现的函数体、类的私有成员函数是类的实现。类的设计者负责类的具体实现过程,类的用户则只需要抽象的思考类做了什么,无需了解类型的工作细节。

2.2. 数据类型

在以前经典的编程学习中,会逐渐从数据类型、表达式、语句、函数,最后才会学到类,接触面向对象的思想。而在现代以面向对象为基础的编程语言(C#、Java、JavaScript)来说:

  1. 类是抽象的自定义数据类型,只不过这个数据类型有自己的属性和方法,以及一系列表达抽象对象的特性。
  2. 语言内置的数据类型也可以认为是一种类,事物对象抽象到极致,就是基本的数据类型。

在C#/Java这样的高级编程语言中,你可以在基本类型中调用其方法;而JavaScript甚至更进一步,弱化了类型这个概念,所有的类型都是隐式的。C++具备像这样的高级抽象能力,但是也兼容C语言那种低级的基础数据类型(short、int、long、char、float、double)。这也正体现了C++的多范式编程的特点:如何看待数据类型和类,取决于你采用面向对象的编程思想还是面向过程式的编程思想。

3. 目录

  1. 面向对象编程(C++篇1)——引言
  2. 面向对象编程(C++篇2)——构造

下一篇

面向对象编程(C++篇1)——引言的更多相关文章

  1. 面向对象编程(C++篇2)——构造

    目录 1. 引述 2. 详述 2.1. 数据类型初始化 2.2. 类初始化 1. 引述 在C++中,学习类的第一课往往就是构造函数.根据构造函数的定义,构造函数式是用于初始化类对象的数据成员的.无论何 ...

  2. 面向对象编程(C++篇3)——析构

    目录 1. 概述 2. 详论 2.1. 对象生命周期 2.2. 不一定需要显式析构 2.3. 析构的必要性 3. 总结 1. 概述 类的析构函数执行与构造函数相反的操作,当对象结束其生命周期,程序就会 ...

  3. Python 第六篇(中):面向对象编程中级篇

    面向对象编程中级篇: 编程思想概述: 面向过程:根据业务逻辑从上到下写垒代码  #最low,淘汰 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 #混口饭吃 def add(ho ...

  4. 面向对象编程(C++篇4)——RAII

    目录 1. 概述 2. 详论 2.1. 堆.栈.静态区 2.2. 手动管理资源的弊端 2.3. 间接使用 2.4. 自下而上的抽象 3. 总结 4. 参考 1. 概述 在前面两篇文章<面向对象编 ...

  5. Python 第六篇(上):面向对象编程初级篇

    面向:过程.函数.对象: 面向过程:根据业务逻辑从上到下写垒代码! 面向过程的编程弊:每次调用的时候都的重写,代码特别长,代码重用性没有,每次增加新功能所有的代码都的修改!那有什么办法解决上面出现的弊 ...

  6. python - 面向对象编程(初级篇)

    写了这么多python 代码,也常用的类和对象,这里准备系统的对python的面向对象编程做以下介绍. 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) ...

  7. 面向对象编程-终结篇 es6新增语法

    各位,各位,终于把js完成了一个段落了,这次的章节一过我还没确定下面要学的内容可能是vue也可能是前后端交互,但无论是哪个都挺兴奋的,因为面临着终于可以做点看得过去的大点的案例项目了,先憋住激动地情绪 ...

  8. 洗礼灵魂,修炼python(41)--巩固篇—从游戏《绝地求生-大逃杀》中回顾面向对象编程

    声明:本篇文章仅仅以游戏<绝地求生>作为一个参考话题来介绍面向对象编程,只是作为学术引用,其制作的非常简易的程序也不会作为商业用途,与蓝洞公司无关. <绝地求生>最近很火,笼络 ...

  9. Python(三)基础篇之「模块&面向对象编程」

    [笔记]Python(三)基础篇之「模块&面向对象编程」 2016-12-07 ZOE    编程之魅  Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...

随机推荐

  1. Python 修改AD密码

    前提条件: AD 已开启证书服务(最重要的一句话). import ldap3 SERVER = 'adserver' BASEDN = "DC=example,DC=com" U ...

  2. Java安全之C3P0链利用与分析

    Java安全之C3P0链利用与分析 0x00 前言 在一些比较极端情况下,C3P0链的使用还是挺频繁的. 0x01 利用方式 利用方式 在C3P0中有三种利用方式 http base JNDI HEX ...

  3. Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能

    Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能 背景 注册-登录-修改密码⼀般需要发送验证码,但是容易被 攻击恶意调⽤ 什么是短信-邮箱轰炸机 手机短信轰炸机是批.循环给 ...

  4. Python写春联(turtle版)

    Python就好比编程界的瑞士军刀,开箱即用.无所不能.这得益于Python简洁易用的语法,以及丰富的第三方库,你想在电脑上做什么,总能找到事半功倍的第三方库.比如,在这新春佳节之际,用Python来 ...

  5. Python 序列类型小结

    序列是python中最基本的数据结构. 序列中每一个元素都有其对应的索引,索引是从0开始,0,1,2......依次类推 python中的序列类型有:字符串str.列表list.元组tuple.Uni ...

  6. AT2164 [AGC006C] Rabbit Exercise

    首先我们可以考虑一下 \(x\) 关于 \(y\) 的对称点的坐标,不难发现就是 \(x + 2 \times (y - x)\),那么期望的增量就会增加 \(2 \times (y - x)\).不 ...

  7. Net6 DI源码分析Part1 ServiceCollection、ServiceDescriptor、ServiceLifetime、IServiceProvider

    ServiceCollection.ServiceDescriptor.ServiceLifetime.IServiceProvider Microsoft.Extensions.Dependency ...

  8. BeanUtils JavaBean 工具包使用

    感谢原文作者:小老弟 原文链接:https://www.cnblogs.com/syncmr/p/10523576.html 目录 简介 BeanUtils类 使用示例 ConvertUtils 功能 ...

  9. iOS中利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G) by徐文棋

    前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也 ...

  10. VC709E 基于FMC接口的FPGA XC7VX690T PCIeX8 接口卡

    一.板卡概述 本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片,支持PCIeX8.两组 64bit DDR3容量8GByte,HPC的FMC连接器,板卡支持各种FMC子卡 ...