类型转换
C++的类型转换提供了4种类型转换操作符来应对不同场合的应用。
类型转换
-
const_cast
类型转换操作符类比Java中的final
修改类型为const
或volatile
属性
比如:
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();
网友评论