美文网首页c/c++
c++基础-异常处理和字符串操作

c++基础-异常处理和字符串操作

作者: Peakmain | 来源:发表于2019-02-25 22:00 被阅读13次

    类型转换

    • 1 static_cast 静态转换 用于基本数据类型之间的转换,如把int转换成char
    • 2 const_cast 常量转换 用于修改常量的值
    • 3 reinterpret_cat 强制类型转换 ,用于转换任意类型
    • 4 dynamic_cast 动态转换 ,更安全,转换成功返回类型,失败返回空 ,必须要包含多态类型和 static_cast 很类似,但是更安全

    Native层实现System.arrayCopy()方法

    Java_com_peakmain_myapplication_MainActivity_arraycopy(JNIEnv *env, jclass type, jobject src,
                                                           jint srcPos, jobject dest, jint destPos,
                                                           jint length) {
        //判断是否是数组
        //都是数组,需要类型转换
        jobjectArray src_array = reinterpret_cast<jobjectArray>(src);
        jobjectArray dest_array = reinterpret_cast<jobjectArray>(dest);
        if (src_array != NULL && dest_array != NULL) {
            __android_log_print(ANDROID_LOG_ERROR, "TAG", "转换成功");
            for (int i = srcPos; i < srcPos + length; ++i) {
                jobject obj = env->GetObjectArrayElement(src_array, i);
                //放到新的数组里面
                env->SetObjectArrayElement(dest_array,i,obj);
            }
        }
    
    

    调用

      static {
            System.loadLibrary("native-lib");
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Person[] person1 = new Person[10];
            for (int i = 0; i < person1.length; i++) {
                person1[i] = new Person("Peakmain", 20 + i);
            }
            Person[] person2 = new Person[10];
            arraycopy(person1, 0, person2, 0, person1.length);
            for (Person person : person2) {
                Log.e("TAG", person.age + "");
            }
        }
    
        public static native void arraycopy(Object src, int srcPos,
                                            Object dest, int destPos,
                                            int length);
    

    c++中异常处理

    自定义异常

    class Exception{
    public:
        string msg;
    public:
        Exception(string msg){
            this->msg = msg;
        }
    public :
        const char*what(){
            return this->msg.c_str;
        }
    };
    void main(){
        // c++ 中有自己一套异常的体系,不要去强记
        // 但是 c++ 可以抛任何数据类型 try{}catch(数据类型 变量名){}
        // throw 抛异常
        try{
            int i = -1;
    
            if (i == 0){
                throw Exception("出异常了");
            }
    
            if (i < 0){
                throw 11.8f;
            }
        }
        catch (int number){
            cout << "捕捉到异常" << number << endl;
        }
        catch (Exception exception){
            cout << "捕捉到异常:" << exception.what() << endl;
        }
        catch (...){
            cout << "捕捉到其他异常:" << endl;
        }
        getchar();
    }
    
    

    NDK 异常总结

    1. 在 c++ 层如果是自己写的代码或者调用别人的方法抛出异常,记得要 try , 如果不 try 在 java 层 try 是没有意义的
    2. 如果异常需要往外抛给 java 层,一定要按照java层抛异常的方式
    3. 如果是自己写的 NDK 层的代码,最好抛自己写的异常,声明异常
    4. 如果是做 c++/c , 或者是帮 c/c++ 写代码,最好抛系统定义好的异常或者继承系统的异常
    5. 系统异常的体系 参看文章

    字符串操作

    对象的操作

    string str1 = "123";
    string str2("123");
    string str3(5, 'A');// 实际是5 个 A = AAAAA
    string *str4 = new string("123");
    

    string 与 char* 相互之间转换 c_str()

    //string->char*
    const char* c_str1 = str1.c_str();
    //char*->string
    char*c_str = "Peakmain";
    string str(c_str);
    cout << str.c_str() << endl;
    

    相关文章

      网友评论

        本文标题:c++基础-异常处理和字符串操作

        本文链接:https://www.haomeiwen.com/subject/pudnyqtx.html