NDK2 C++基础,模板编程、类型转换、异常

模板编程(java中的泛型)

template关键字
T,不确定类型;
class,类泛型
using namespace std; 使用匿名空间 下面的string就不需要写成 std::string了
栈中实例化的对象可以 . 在堆中实例化的对象用 ->

//使用匿名空间	下面的string就不需要写成 std::string了
using namespace std;

// TODO 普通的模板
template <class T>
T getMax(T num,T num2){
    return num > num2 ? num : num2;
}
// TODO 类模板,这里我们定义了三个类泛型
template <class CLASS1,class CLASS2,class CLASS3>
class TestClass{
public:	//记得公开
    CLASS1 getType(CLASS1 c){
        return c;
    }
    CLASS2 getType(CLASS2 c){
        return c;
    }
    CLASS3 getType(CLASS3 c){
        return c;
    }
};

int main(){
    // TODO java的泛型 == C++的模板编程
    // 使用普通的模板
    getMax(9,8);
    getMax(999.22,811.22);
    getMax(999.22,811);
     //使用类模板 确定对应的类型
    TestClass<int,string,double> testClass; //栈中实例化对象 可以用 .
    testClass.getType(100);
    testClass.getType("KAIZI");
    testClass.getType(111.2);
    //堆中实例化对象    用->
    TestClass<int,string,double> *t = new TestClass<int,string,double>;
    t->getType(100);
}

类型转换

普通类型转换

const 等于是常量级别的;
括号里面 const_cast<需要转换后的类型>;

int main(){
	// 普通类型的转换
    //const 等于是常量级别的
    const char * c1 = "#x121314121";
    //将上面的const char *  转换成 普通的 char * 类型
    //括号里面   const_cast<需要转换后的类型>
    char * c2 = const_cast<char *>(c1);
    char * c3 = "#x124443322";
    //将上面的char *  转换成 普通的 const char * 类型
    //括号里面   const_cast<需要转换后的类型>
    const char * c4 = const_cast<const char * >(c3);
}

静态类型转换

静态类型的转换(涉及的是指针类型相关的转换操作);
括号里面 static_cast<需要转换后的类型>;
记得释放 回收的规则,一定是谁 new了 , 就需要回收释放谁;

class FuClass{
public:
    void show(){
        LOGD("FuClass=====show");
    }
};

class ZiClass : public FuClass{
public:
    void show(){
        LOGD("ZiClass=====show");
    }
};

int main(){
    // 静态类型的转换(涉及的是指针类型相关的转换操作)
    FuClass *fuClass = new FuClass;
    //将上面FuClass * 类型转换成 ZiClass * 类型
    //括号里面   static_cast<需要转换后的类型>
    ZiClass *ziClass = static_cast<ZiClass *>(fuClass);
    //虽然show方法不是虚函数,但是FuClass被转换成ZiClass * 类型了,所以这类的show方法调用的是子类的
    //父类show是个虚函数,就会调用到父类的show方法
    ziClass->show();
    //记得释放  回收的规则,一定是谁 new了 , 就需要回收释放谁
    delete fuClass;
}

动态类型转换

动态类型的转换—运行时期

动态多态 一定是在运行的时候,确定父类函数中是否有虚函数;注意这里有一个virtual 关键字

class FuClass{
public:
    virtual void show(){
        LOGD("FuClass=====show");
    }
};

class ZiClass : public FuClass{
public:
    void show(){
        LOGD("ZiClass=====show");
    }
};

转换失败

静态 和 动态多态的区别
静态多态 编译时期,只看左边是谁,就调用谁的方法;
动态多态 一定是在运行的时候,确定父类函数中是否有虚函数;
动态类型转换的时候,在运行时期 fuClass 是父类new出来的,就会转换失败,就不能转子类;

 	    //静态 和  动态多态的区别
    //静态多态  编译时期,只看左边是谁,就调用谁的方法
    //动态多态  一定是在运行的时候,确定父类函数中是否有虚函数
    //动态类型的转换---运行时期
    //动态类型转换的时候,在运行时期 fuClass 是父类new出来的,就会转换失败,就不能转子类
    FuClass *fuClass = new FuClass;
    ZiClass *ziClass = dynamic_cast<ZiClass *>(fuClass);
    //在运行的时候,使用多态关键字转换操作后,会返回一个值,这个值就是转换后的值
    if(ziClass){    //不为空的情况下 转换成功
        LOGD("ziClass 转换成功");
        ziClass->show();
    }else{  //为空的情况下 转换失败  上面这样转换的情况下,一定是转换失败
        LOGD("ziClass 转换失败");
    }

转换成功

静态 和 动态多态的区别
静态多态 编译时期,只看左边是谁,就调用谁的方法;
动态多态 一定是在运行的时候,确定父类函数中是否有虚函数;
转换成功的原因:因为new出来的是子类,所以在动态转换的时候能转换成功;
show方法调用的是子类的show方法,因为有虚函数;

     //静态 和  动态多态的区别
    //静态多态  编译时期,只看左边是谁,就调用谁的方法
    //动态多态  一定是在运行的时候,确定父类函数中是否有虚函数
    //动态类型的转换---运行时期
    //因为new出来的是子类,所以在动态转换的时候能转换成功
    FuClass *fuClass = new ZiClass;
    ZiClass *ziClass = dynamic_cast<ZiClass *>(fuClass);
    //在运行的时候,使用多态关键字转换操作后,会返回一个值,这个值就是转换后的值
    if(ziClass){    //不为空的情况下 转换成功
        LOGD("ziClass 转换成功");
        ziClass->show();	//调用的是子类的show方法,因为有虚函数
    }else{  //为空的情况下 转换失败
        LOGD("ziClass 转换失败");
    }

异常

“出现异常了…” == const char * (内部会自动转换成这个类型);
c语言中字符串都是用 char * 来接收的;
如果抛出异常,不捕获,在运行的时候,会发生崩溃
VS CLion 和 AS兼容上有点问题,编译上AS很多通不过
AS里面可以用throw logic_error(“出现异常了”);

void exceptMethod(){
    //"出现异常了..."    ==   const char *  (内部会自动转换成这个类型)
    // c语言中 "xxxxxx" 默认用 const char *
    // c语言中字符串都是用  char * 来接收的
    char * s = "啊啊啊啊啊";
    throw "出现异常了...";
}

void exceptMethod2(){
    //在 VS CLion上可以这样写
//    throw exception("出现异常了");
//    throw logic_error("出现异常了");	//AS里面可以用这个logic_error

    //在AS上,传出异常信息尝试无效  编译不通过
    throw exception();
}

//下面这种自定义exception   在VS CLion上可以这样写,在AS上面 编译不通过
//自定定义一个exception异常,继承exception==========start===========
//class CustomException : exception{
//public:
//    //重写what方法,注意是   返回值都得一样
//    const char * what() const {
//        return "自定义的CustomException异常";
//    }
//};
//void exceptMethod3(){
//    CustomException c;
//    throw c;
//}
//自定定义一个exception异常,继承exception==========end===========

int main(){
    //TODO 异常
    //如果抛出异常,不捕获,在运行的时候,会发生崩溃
    try {
        exceptMethod();
    }catch (const char * excmsg){
        LOGD("捕获到异常:%s",excmsg);
    }

    try {
        exceptMethod2();
    }catch (exception &e){
        //e.what()  也是 const char *   类型
        e.what();
        LOGD("捕获到异常2:%s",e.what());
    }
//    try {
//        exceptMethod3();
//    }catch (exception &e){
//        //e.what()  也是 const char *   类型
//        e.what();
//        LOGD("捕获到异常2:%s",e.what());
//    }
}

辛苦各位童鞋观看到最后,如果博客中有不对的地方望指出,大神勿喷,谢谢~~

  • 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)的一种高级编程技术。NDKAndroid开发工具包中的一个工具,允许开发者使用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、付费专栏及课程。

余额充值