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变量系列--1

    所以这里需要注意变量的使用,print(message),直接去引用,和shell略有不同 1.变量名只能包含字母,数字,下划线,但不能以数字开头 2.变量名不能含有空格

  2. Let's Encrypt 证书 wget 报错

    最近发现一个奇怪的问题,网站使用 let's encrypt 的免费证书,浏览器访问时正常,但是wget的时候报错.报错信息如下: wget https://www.example.com --202 ...

  3. maven项目 子父级工程。

    一 .什么是 maven 子父级工程? 建立一个maven项目,然后在该项目 下创建一个module,子级的maven,他继承于父级项目. 1.新建立 maven项目,file  ------new- ...

  4. vite搭建vue项目-集成别名@、router、vuex、scss就是这样简单

    为什么要使用vite 当我们开始构建越来越大型的应用时, 需要处理的 JavaScript 代码量也呈指数级增长. 包含数千个模块的大型项目相当普遍. 这个时候我们会遇见性能瓶颈 使用 JavaScr ...

  5. ApacheCN Kali Linux 译文集 20211020 更新

    Kali Linux 秘籍 中文版 第一章 安装和启动Kali 第二章 定制 Kali Linux 第三章 高级测试环境 第四章 信息收集 第五章 漏洞评估 第六章 漏洞利用 第七章 权限提升 第八章 ...

  6. JMeter压力测试简单使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11915535.html JMeter压力测试简单使用: 我们可以使用JMeter来测试一下自己 ...

  7. iOS 如何监听用户在手机设置里改变了系统的时间?

    如何监听用户未退出APP但通过Home键在手机设置里改变了系统的时间? 用户虽未退出APP,但是当它按Home键退到后台时 ,会调用该方法: - (void)applicationDidEnterBa ...

  8. LPL Ban/Pick 选人阶段的遮罩效果是如何实现的?

    最近 S11 LPL 春季赛开赛,在看比赛的过程中,我发现新赛季的 Ban/Pick 选人阶段,出现了一种新的,有意思的遮罩效果,如下图所示: 当然,它是一个动态的效果,当选人的过程中,会有一种呼吸的 ...

  9. Spring Boot数据访问之Druid连接池的配置

    在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中数据源连接池方式缺省(type)情况下默认使用HikariCP,那不缺省如何配置呢?我们 ...

  10. 天啦,从Mongo到ClickHouse我到底经历了什么?

    前言: 在实现前端监控系统的最初,使用了 Mongo 作为日志数据存储库.文档型存储,在日志字段扩展和收缩上都能非常方便.天生的 JSON 格式和 NodeJs 配合也非常贴合.就这样度过了几个月的蜜 ...