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. Linux中date命令用法

    1.以下是服务器现在的时间,当前时间的各种表示方法,表示成自己想要的时间格式,后面的范例将会在这个时间基础之上进行演示,同时这也是熟练掌握后面各种date命令的前提,请读者注意 [root@RHEL6 ...

  2. switch多选择结构

    switch多选择结构 多选择结构还有一个实现方式就是switch case语句. switch case 语句判断一个变量与一个系列值中某个值是否相等,每个值称为一个分支. 语法: switch(e ...

  3. 再见丑陋的 SwaggerUI,这款开源的API文档生成神器界面更炫酷,逼格更高!

    一般在使用 Spring Boot 开发前后端分离项目的时候,都会用到 Swagger.Swagger 是一个规范和完整的框架,用于生成.描述.调试和可视化 RESTful 风格的 Web API 服 ...

  4. synchronized、ReentrantLock、volatile

    名词解释 synchronized 是Java中的关键字,是一种同步锁,可以修饰代码块,方法,静态的方法,类.synchronized(Object) 不能用String常量.Integer. Lon ...

  5. java的四种引用:强软弱虚

    简介 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于(reachable)可达状态,程序才能使用它. 从JDK 1.2版本开始,对象的引 ...

  6. 将string字符串中的换行符进行替换

    /** * 方法名称:replaceBlank * 方法描述: 将string字符串中的换行符进行替换为"" * */ public static String replaceBl ...

  7. 远程连接MySQL报错1045解决方案

    MySQL远端操作步骤: 方法一: USE mysql: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH ...

  8. 广播接收者案例_ip拨号器

    (1)定义一个类继承BroadCastReceiver public class OutGoingCallReceiver extends BroadcastReceiver { //当接收到外拨电话 ...

  9. 【密码学工具】Ciphey和WinDecrypto的使用随笔

    1.Ciphey 官方文档 这个工具安装起来也很容易,用pip下载即可. pip install ciphey -i https://pypi.mirrors.ustc.edu.cn/simple/ ...

  10. CentOS卸载自带的JDK

    一般在配置JDK之前要卸载CentOS自带的openjdk,接下来演示如何卸载自带的openjdk 进入root模式 查看jdk是否已经安装jdk rpm -qa | grep jdk 3. 卸载op ...