三、C++数据类型
11、复数类型
使用复数类型必须要包含头文件:
#include <complex>
定义复数类型:
complex< double > purei( 0, 7 ); // 0+7i
complex< float > real_num( 3 ); // 3+0i
complex< long double > zero; // 0+0i
complex< double > purei2( purei ); // 0+7i
complex< double > conjugate[ 2 ] = {
complex< double >( 2, 3 ),
complex< double >( 2, -3 )
}; // 复数数组
complex< double > *ptr = &conjugate[0]; // 复数指针
complex< double > &ref = *ptr; // 复数引用
12、typedef名字
typedef用来给类型名称起一个别名,这样我们在使用的时候,会更加方便或者更容易记。
typedef double wages; // 我们定义了一种叫wages的类型,其实就是double
wages hourly, weekly; // double hourly, weekly;
使用typedef名字后,我们并没有引入一种新的类型,而是为现有的类型引入了一个助记符号,在一些情况下,它能够降低声明的复杂性。
【typedef不是简单的字符串替换!】简单记住,遇到const的时候,typedef并不能简单展开,const和typedef后的名字同时修饰变量。下面的例子里面,cstring和const同时修饰变量cstr,所以应该是个指针常量而不是常量指针,如果简单展开的话就是常量指针了。
typedef char *cstring;
extern const cstring cstr;
char *const cstr;
如果使用了#define,那么就是常量指针!
#define char * cstring
extern const cstring cstr;
const char *cstr
13、volatile限定修饰符
volatile限定修饰符能够阻止编译器控制或监测之外的改变,例如系统时钟更新的变量。
volatile用法:其实和const差不多,就是在声明前面告诉编辑器,这个对象值可能在编辑器监测外改变,然后不让它改变。
volatile int display_register;
volatile Task *curr_task;
volatile int ixa[ max_size ];
volatile Screen bitmap_buf;
举个例子:【在使用volatile之前,如果我们不改变一个变量的值,那么编译器为了节省汇编语言或是空间,它会直接把变量优化成一个常量来看,这样可能能缩短汇编语言的长度【中间可能省略一些条件代码】。但是加上 了volatile之后,那么编译器不会耍聪明,就还是会老老实实把程序翻译成汇编语言,该怎么访问内存就怎么访问内存。】
但是对于具体的使用场景,还是没能理解,等以后看到项目中代码再重新回头理解。
14、pair类型
使用pair类型必须包含头文件:
#include <utility>
pair的作用就是把不同类型的两个值关联起来【让我想到了哈希表hh】。
pair的使用方法:
pair< string, string > author( "James", "Joyce" );
访问方式:
author.first //访问第一个元素