ndk学习之c++语言基础复习----面向对象编程

关于面向对象编程对于一个java程序员那是再熟悉不过了,不过对于C++而言相对java还是有很多不同点的,所以全面复习一下。

C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,用户定义的类型。

咱们来新建一个头文件来定义一下类:

其访问修饰符具体含义如下:

  • private:可以被该类中的函数、友元函数访问。 不能被任何其他访问,该类的对象也不能访问。 

  • protected:可以被该类中的函数、子类的函数、友元函数访问。 但不能被该类的对象访问。

  • public:可以被该类中的函数、子类的函数、友元函数访问,也可以被该类的对象访问。

其中构造函数和析构函数目前还木有实现,其实可以在声明的时候就定义实现,如下:

也可以在cpp中进行实现,新建一个cpp文件:

咱们来使用一下它:

编译运行:

其中类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行(不需要手动调用)。

另外如果想通过构造方法来给成员变量赋值,当然可以跟java一样如下弄:

但是在cpp中还有它独特的地方就是在声明构造时就可以给成员变量进行赋值,表现如下:


此时实例化就得传两个参数了:

常量函数

函数后写上const,表示不会也不允许修改类中的成员。下面来看看:

声明一个给成员变量赋值的方法,没啥问题,但是!!如果给这个函数的后面加一个const修饰,情况就不一样啦,如下:

其错误提示为:

比较简单,也就是如果发现该函数只能读不会写,则可将其声明为常量函数。

友元 

类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。

  • 友元函数
    这个是有别于Java的,假如咱们想通过这个函数来修改类中的私有成员,如下:

    此时就需要将这个函数声明为友元函数,具体做法如下:

    此时方法就不报错了:

    咱们来使用一下:

    编译运行:

  • 友元类
    下面来声明一个友元类:

    此时就可以将Teacher声明为Student类中的友元类,如下:

    也就是当Teacher声明为Student的友元类时,则Teacher中所有的函数及成员都是Student中的友元了。

静态成员

和Java一样,可以使用static来声明类成员为静态的,当我们使用静态成员属性或者函数时候 需要使用 域运算符 ::,下面咱们以单例模式为例:

在头文件中声明一个Instance类:

其中需要注意的是,对于静态成员是需要进行初始化的,可以在头文件中声明时就初始化,也可以在.cpp中进行,这里以cpp的方式来对成员变量进行初始化,如下:

下面来具体实现getInstance()方法:

我们知道对于Java来说这样写是会有线程安全问题,那对于C++11编译器来说会保证内部静态变量的线程安全的, 当然可以加锁,关于多线程的问题在之后会学习到,这里先不管多线程的情况,下面来使用一下这个单例:

重载函数

C++ 允许在同一作用域中的某个函数运算符指定多个定义,分为函数重载运算符重载

  • 函数重载
    这个跟java一样,所以举个例子既可:
  • 操作符重载
    这个是C++独有的,C++允许重定义或重载大部分 C++ 内置的运算符 ,函数名是由关键字 operator 和其后要重载的运算符符号构成的 ,重载运算符可被定义为普通的非成员函数或者被定义为类成员函数
    成员函数:
    新建一个头文件:

    假设要实现这样的一个操作,如下:

    接下来操作符重载就是将不可能成为可能,具体做法如下:

    此时定义了+号运算符重载之后,之前的对象相加操作就可以正常啦,看下结果:

    但是!!!有一个疑问:我们在操作符重载是在栈上申请的一块空间,那出了方法应该就会被回收,如下:

    那为啥我们还能在表达式中看到正常的结果呢?

    这是因为对于这个表示式底层是存在对象拷贝操作的,如下:

    那何以见得呢?咱们可以先定义一个拷贝函数来打印一下是否如猜想:

    所以定义一个无参的构造方法:

    此时咱们来运行看一下是否调用了两次拷贝构造:

    呃~~翻车了么?其实是因为:

    由于程序是在mac上跑的,可见是对返回值是做了RVO优化,从而是看不到拷贝构造函数的调用了。 总之记住一点:本来是要进行两次对象拷贝的,但是编译器做了一些优化最终会减少或者完全看不到对象的拷贝迹象了。

    非成员函数:
    新声明一个类:

    接着来声明操作符重载,这里不需要定义到Test2类的内部了,直接在我们调用的外部中来声明,如下:

    然后运行看一下结果:

    其中允许重载的运算符如下:

     比如说重载new、delete如下:

    void *operator new (size_t size)
    {
        cout << "新的new:" << size << endl;
        return malloc(size);
    }
    
    void operator delete(void *p)
    {
        //释放由p指向的存储空间
        cout << "新的delete" << endl;
        free(p);
    }

继承

跟java一样,类也是存在继承的,范例:

class A:[private/protected/public] B

默认为private继承 

A是基类,B称为子类或者派生类 

下面来看下具体代码:

那下面来使用一下:

此时涉及到继承的访问修饰符了,由于默认情况下是private继承,所以既使父类的方法是public的子类也无法访问,要访问就得将继承修饰符改一下:

其中涉及到继承修饰符如下:

方式说明
public基类的public、protected成员也是派生类相应的成员,基类的private成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
protected基类的公有和保护成员将成为派生类的保护成员
private基类的公有和保护成员将成为派生类的私有成员

另外有一点是跟java不同的,java只支持单继承,而c++是支持多继承的,如下:

下面来看一下打印:

此时调用子类的test()会打印啥呢?如下:

而如果子类想调用父类的方法该如何写呢?

编译运行:

那如果将子类的test()方法删掉又会怎样呢?

从错误提示来看是因为在父类中定义有多个test()方法,咱们删掉其中一个基类的test()方法:

此时就正常了,再次编译运行:

从这个就可以看出为啥刚才报基类有多个test()的异常,是因为如果子类没有实现父类的方法,那么就会调用父类的,但是父类定义了两个test()方法,所以编译器不知道调哪个了,所以就报错了。

多态

多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。

静态多态(静态联编)是指在编译期间就可以确定函数的调用地址,通过函数重载模版(泛型编程)实现,那下面来举个例子来体会一下静态多态的表现:

此时打印的是:

动态多态(动态联编)是指函数调用的地址不能在编译器期间确定,必须需要在运行时才确定 ,通过继承+虚函数 实现,下面来看下:

其调用方式不变:

编译运行:

此时就调用的真正类型的方法,基于此,有下面一个原则:

构造函数任何时候都不可以声明为虚函数。

析构函数一般都是虚函数,释放先执行子类再执行父类,如果不声明为虚函数,则在多态中只会调用父类的析构函数了。

另外还有一种纯虚函数,其意义跟java中的abstract抽象方法类似,具体如下:

此时如果运行就会报错:

也很容易理解,跟java的一样,纯虚函数是一定需要在子类中进行实现的,如下:

此时编译就不报错了。

模板

模板是泛型编程的基础

  • 函数模板【类似于java中的泛形方法】
    函数模板能够用来创建一个通用的函数。以支持多种不同的形參。避免重载函数的函数体反复设计。
    下面来使用一下:

    其中有个等价的写法:



  • 类模板【类似于java中的泛型类】

    为类定义一种模式。使得类中的某些数据成员、默写成员函数的參数、某些成员函数的返回值,能够取随意类型

    常见的 容器比如 向量 vector 或 vector 就是模板类

    下面来看下代码如何写:

基本上跟java类似~ 

转载于:https://www.cnblogs.com/webor2006/p/9703968.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android C 高级编程是指在Android开发中使用C语言进行高级编程的技术。而使用NDK(Native Development Kit)可以使开发者在Android应用中使用C/C++等本地语言进行编程。 NDK是一个工具集,它允许开发者在Android应用中嵌入本地代码,并且提供了一系列的开发工具和库,以便开发者能够在Android应用中使用C/C++进行高级编程。使用NDK可以提供更高的性能和更低的内存占用,适用于需要处理大量数据和高性能计算的应用场景。 在使用NDK进行Android C高级编程时,可以使用PDF(Portable Document Format)作为文档格式,以便对代码和项目进行更好的管理和文档化。在NDK的开发过程中,可以使用PDF文档记录关键的设计思路、代码逻辑、接口定义等信息,以方便团队协作和后续的维护。 使用NDK进行Android C高级编程的步骤大致如下: 1. 准备开发环境:安装NDK并配置好开发环境,包括设置NDK的路径和编译器等。 2. 创建新项目:使用Android Studio创建一个新的Android项目,并在项目中引入NDK的支持。 3. 编写C代码:使用C/C++语言编写需要调用的函数、算法或者数据结构等代码,并将其保存在适当的目录下。 4. 编写JNI接口:在生成的Java代码中,使用JNI(Java Native Interface)定义对应C代码的接口,以便在Java层调用C代码。 5. 编译和构建:使用NDK的工具集进行编译和构建,将C代码编译成适合Android平台使用的库文件(.so文件)。 6. 在Java代码中调用C代码:在需要调用C代码的地方,使用JNI接口调用对应的C函数,以实现和C代码的交互和调用。 使用PDF文档进行文档化可以帮助开发者更好地组织和管理代码、接口和设计文档等,方便后续的代码维护和项目协作。同时,也可以作为项目的参考文档,方便其他开发人员了解和使用项目。 ### 回答2: Android C 高级编程是针对使用NDK(Native Development Kit)的一种高级编程技术。NDK是Android开发工具包中的一个工具,允许开发者使用C、C++或其他本地编程语言编写Android应用程序的部分或全部代码。 使用NDK进行Android C高级编程有许多优点。首先,NDK提供了更高的性能和更好的控制权,特别是在处理图形、音频和计算密集型任务时。通过使用本地编程语言,开发者能够更好地利用底层系统资源,提高应用程序的执行效率和速度。 其次,NDK还提供了对现有C和C++库的支持。这意味着开发者可以使用许多已经存在的库和功能来加快开发进程。无需重新编写现有的代码,直接使用NDK与这些库进行集成即可。 在使用NDK进行Android C高级编程时,一种常见的用途是开发游戏。使用C或C++编写游戏代码可以获得更好的性能和更低的延迟,这对于游戏的流畅运行至关重要。 此外,开发者还可以使用NDK为现有的Java应用程序添加本地本地扩展。这样可以通过使用C或C++编写某些关键组件,以改进应用程序的性能或添加新的功能。 总的来说,通过使用NDK进行Android C高级编程,开发者可以获得更高的性能、更好的控制权和更好的资源利用。无论是开发游戏还是优化应用程序,使用NDK都是提高性能和扩展功能的好方法。通过阅读相关的PDF文档,开发者可以更深入地了解如何使用NDK进行Android C高级编程。 ### 回答3: Android NDK (Native Development Kit) 是一个用于开发 Android 应用程序的工具集,它使开发者能够使用 C 或 C++ 编写原生代码,并将其与 Java 编写的 Android 应用程序一起使用。使用 NDK 可以达到增加性能、复用现有的 C/C++ 代码以及访问底层硬件等目的。 在 Android C 高级编程中,使用 NDK 商用 PDF 库可以实现在 Android 应用程序中处理 PDF 文件的功能。PDF 文件是一种常见的电子文档格式,使用 PDF 库可以读取、编辑和生成 PDF 文件。 使用 NDK 进行 PDF 处理的一般步骤如下: 1. 集成 PDF 库:首先,需要将商用的 PDF 库 (.so 文件) 集成到 Android 项目中。可以通过在 Android.mk 文件中添加相关配置,确保 .so 文件正确地被编译和链接到应用程序中。 2. 创建 JNI 接口:为了在 Java 层与 C/C++ 层之间进行通信,需要创建 JNI (Java Native Interface) 接口。可以在创建 JNI 方法时使用 JNAerator 或者手动编写 JNI 代码,以便在 Java 层调用 C/C++ 的功能。 3. 对 PDF 文件进行处理:在 C/C++ 层,可以使用 PDF 库提供的功能来处理 PDF 文件。例如,可以使用库提供的函数来解析、渲染、添加标注、提取内容等。 4. 将数据返回给 Java 层:在 C/C++ 层处理完之后,可以通过 JNI 接口将处理后的数据返回给 Java 层。这样就可以在 Android 应用程序中显示或者存储处理后的 PDF 文件。 需要注意的是,在使用商用 PDF 库时,需要遵循相关的许可协议,并确保在开发和分发过程中合法使用该库。 总之,通过使用 NDK 和商用 PDF 库,可以使 Android 应用程序具有处理 PDF 文件的高级编程能力。同时,开发者需要具备 C/C++ 编程和 JNI 接口的使用经验,以便顺利地进行开发工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值