面向对象编程(C++篇1)——引言

简介: 面向对象编程(C++篇1)——引言

面向对象编程(C++篇1)——引言

目录

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的区别在于,struct定义类的数据成员和成员函数默认的访问权限是public:公有的,能被外部访问;而class则是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)——构造
  3. 面向对象编程(C++篇3)——析构
  4. 面向对象编程(C++篇4)——RAII

下一篇

分类: C++

标签: C++ , 面向对象


相关文章
|
5月前
|
编译器 C++
Essential C++ 第5章 面向对象编程风格
Essential C++ 第5章 面向对象编程风格
|
6月前
|
C++
C++面向对象编程
C++面向对象编程
|
6月前
|
编译器 C++
【C++类和对象下:解锁面向对象编程的奇妙世界】(下)
【C++类和对象下:解锁面向对象编程的奇妙世界】
|
3月前
|
C++
拥抱C++面向对象编程,解锁软件开发新境界!从混乱到有序,你的代码也能成为高效能战士!
【8月更文挑战第22天】C++凭借其强大的面向对象编程(OOP)能力,在构建复杂软件系统时不可或缺。OOP通过封装数据和操作这些数据的方法于对象中,提升了代码的模块化、重用性和可扩展性。非OOP方式(过程化编程)下,数据与处理逻辑分离,导致维护困难。而OOP将学生信息及其操作整合到`Student`类中,增强代码的可读性和可维护性。通过示例对比,可以看出OOP使C++代码结构更清晰,特别是在大型项目中,能有效提高开发效率和软件质量。
33 1
|
3月前
|
JavaScript Java C语言
面向对象编程(C++篇3)——析构
面向对象编程(C++篇3)——析构
29 2
|
3月前
|
存储 Java 程序员
面向对象编程(C++篇4)——RAII
面向对象编程(C++篇4)——RAII
37 0
|
3月前
|
JavaScript 前端开发 Java
面向对象编程(C++篇2)——构造
面向对象编程(C++篇2)——构造
31 0
|
6月前
|
算法 程序员 数据安全/隐私保护
C++中的面向对象编程(OOP)深入解析
C++中的面向对象编程(OOP)深入解析
|
5月前
|
存储 C++ C语言
【C++语言】初步认识面向对象编程&&类和对象(上)
【C++语言】初步认识面向对象编程&&类和对象(上)
|
6月前
|
C++
C++ 递归与面向对象编程基础
C++ 递归是函数自我调用的技术,用于简化复杂问题。以递归求和为例,`sum` 函数通过不断调用自身累加数字直到 `k` 为 0。递归需谨慎,避免无限循环和资源浪费。面向对象编程(OOP)将程序划分为交互对象,具有属性和方法,提升代码复用、维护和扩展性。C++ OOP 基本概念包括类、对象、属性和方法。通过创建类和对象,利用点语法访问成员,实现代码组织。
47 0