美文网首页
JNI基础 -- C++基础知识(类型转换/异常处理/IO )

JNI基础 -- C++基础知识(类型转换/异常处理/IO )

作者: 刘小厨 | 来源:发表于2020-04-20 19:25 被阅读0次

类型转换

C++的类型转换提供了4种类型转换操作符来应对不同场合的应用。


类型转换
  • const_cast类型转换操作符类比Java中的final
    修改类型为constvolatile属性
    比如:
const char* a;//const表示常量,类比Java中的final
    //强转成一个char*类型
char* b=const_cast<char*>(a);
  • static_cast
    1.基础类型之间互转。如: float转成int、int转成unsigned int等
    2.指针与void之间互转。如: float转成void、Bean转成void、 函数指针转成void*等
    3.子类指针/引用与父类指针/引用转换。

比如:

class Parent {
public:
    void test() {
        std::cout << "Parent\n";
    }
};
class Child :public Parent {
public:
    void test() {
        std::cout << "Child\n";
    };
};

转换

  Parent* p = new Parent;
    Child* c = static_cast<Child*>(p);
    //输出c
    c->test();
  • dynamic_cast
    主要将基类指针、引用安全地转为派生类.
    在运行期对可疑的转型操作进行安全检查,仅对多态有效

使用dynamic_cast进行类型转换需要注意:
①基类至少有一个虚函数
②对指针转换失败的得到NULL , 对引用失败抛出bad_ .cast异常
比如:

class Parent {
public:
    virtual void test() {
        std::cout << "Parent\n";
    }
};
class Child :public Parent {
public:
    void test() {
        std::cout << "Child\n";
    };
};

转换

 Parent* p = new Parent;
    Child* c = dynamic_cast<Child*>(p);
    if (!c){
        std::cout << "转换失败\n";
    }
    Parent* p1 = new Child;
    Child* c1 = dynamic_cast<Child*>(p1);
    if (c1) {
        std::cout << "转换成功\n";
    }
  • reinterpret_cast
    对指针、引用进行原始转换

比如:

 float i = 10;
    //&i float指针,指向一一个地址,转换为int类型,j就是这个地址
    int j = reinterpret_cast<int>(&i);
    cout << hex << &i << endl;
    cout << hex << j << endl;
    cout << hex << i << endl; //输出十六进制数
    cout << oct << i << endl; //输出八进制数
    cout << dec << i << endl; //输出十进制数

异常

C++中的异常和Java中的比较相似,看下简单的代码:

//直接抛出异常
void test1(){
  throw "测试!";
};
//封装异常对象抛出
void test2(){
  throw exception("测试");
}
//直接try  catch 异常
  try {
        test1();
    }
    catch (const char* m) {
        cout << m << endl;
    }
//捕获异常信息,如:exception.what() 
    try {
        test2();
    }
    catch (exception& e) {
        cout << e.what() << endl;
    }
//自定义异常
class MyException : public exception
{
public:
    virtual char const* what() const
    {
        return "myexception";
    }
};

IO 文件与流操作

C语言的文件读写操作
定义在头文件:stdio.h
函数原型: FILE * fopen(const char * path, const char * mode);
path:操作的文件路径
mode:模式

模式

比如:

写操作:

 FILE* f = fopen("xxxx\\t.txt", "w");
    //写入单个字符
    fputc('a', f);
    fclose(f);

    FILE* f = fopen(" xxxx\\t.txt", "w");
    //这样写IDE会提示错误,后面的字符串被认为是常量,不能初始化给 char *txt ,可强转或先定义个数组
    char *txt = "123456";
    //写入以nu11结尾的字符数组
    fputs(txt,f);
    //格式化并输出
    fprintf(f,"%s", txt);
    fclose(f);

读操作:

    //读取一个字符
    FILE* f = fopen(" xxxx\\t.txt", "r");
    fgetc(f);

   //读取遇到第一个空格字符停止
    char buff[255];
    FILE* f = fopen("xxxx\\t.txt", "r");
    fscanf(f,"%s",buff);
    printf("1: %s\n", buff);

 //最大读取255-1 个字符
    char buff[255];
    FILE* f = fopen("xxxx\\t.txt", "r");
    fgets(buff, 255,f);
    printf("2: %s\n",buff);
    fclose(f);

二进制I/O函数

    size_t fread(void* ptr, size_t size_of_elements,
        size_t number_of_elements,FILE * a_file);
    size_t fwrite(const void* ptr, size_t size_of_elements,
        size_t number_of_elements, FILE * a_file);
    //1、写入/读取数据缓存区
    //2、每个数据项的大小
    //3、多少个数据项
    //4、流
    //如:图片、视频等以二进制操作:
    //写入buffer有1024个字节
    fwrite(buffer, 1024, 1, f);

C++文件读写操作
头文件引入: <iostream>和<fstream>


数据类型

比如:

char data[100];
    //以写模式打开文件
    ofstream outfile;
    outfile.open("xXX\\f .txt");
    cout << "输入你的名字: ";
    //cin接收终端的输入
    cin >> data;
    //向文件写入用户输入的数据
    outfile << data << endl;
    //关闭打开的文件
    outfile.close();
    //以读模式打开文件
    ifstream infile;
    infile.open("XXX\\f .txt");
    cout << "读取文件" << endl;
    infile >> data;
    cout << data << endl;
    //关闭
    infile.close();

相关文章

网友评论

      本文标题:JNI基础 -- C++基础知识(类型转换/异常处理/IO )

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