c++ primer学习(一)类型

来源:互联网 发布:hadoop windows版本 编辑:程序博客网 时间:2024/04/25 18:20

之前因为做任务而学习了一小部分c++,不过更多的是和c混合的垃圾代码,就是借用了一些c++中的标准库等,使工作变得更轻松。考虑到以后要长期使用c++,于是打算系统学习一下。

听从了很多人的建议,学习c++ primer第五版。

那么开始第一部分的整理:变量和类型。

类型:1.算术。包括整型和浮点型,整型包括整型,布尔,字符。他们包括(括号内为最小大小的位数):

整型:short(16),int(16),long(32),long long(64);其大小为short<=int<=long<=long long,具体大小受系统和编译器影响。给其前添加unsigned则变为无符号型。

布尔:bool(未定)。

字符:char(8),wchar_t(16),char16_t(16),char32_t(32),后两个为Unicode字符集表示。char表现为unsigned char或者signed char,决定于编译器。

tips,一般,8位=1字节(byte),4or8字节=1字(word);位和比特(bit)是一个含义。字节是最小可寻址内存块。

浮点型:float(6位有效数字),double(10位有效数字),long double(10位有效数字),精度不定。

             2.空类型。

赋值 / 类型转换

1.给bool赋一个非0的值:结果为true;否则为false。

2.给整型如(int)赋一个数则自动转换为整数;给浮点型赋一个数也自动转换为浮点型。

tips,对无符号类型赋一个超出范围的值,结果是此数对此类型最大值求模取余。对带符号的赋一个超出范围的值,结果未定义。

3.表达式同时含有unsigned和signed,signed会转换为unsigned再计算。

tips,慎对unsigned用--i。

字面值常量(literal)

十进制literal是带符号数,取unsigned int~unsigned long long,int~long long中最小的。浮点数用e和.来标示。

字符literal由 ' ' 表示;字符串literal由 " " 表示。字符串literal类型是数组。结尾有'\0',比实际串长1。

指定字面值的类型:通过前缀和后缀。

变量

变量的定义可以一行一个类型全部定义,包括指针。如int s=0,a,*b=&s;。

初始化可以使用任何表达式。列表初始化的形式如int a={0};,若初始化值会丢失,则报错。

默认初始化:int a; 由定义的位置确定值。函数之外的值为0,函数之内未定。main()也算函数,但是在g++4.8.4中main()默认为0;vs2013中为未定。

声明和定义:声明不开辟存储空间,想使用其他位置的名字必须包含声明。定义要开辟空间。变量只能定义一次,可声明多次。使用extern声明。

tips,对象:具有某种数据类型的内存空间。

作用域

内层覆盖外层。

tips,在内层使用外层变量:::

复合类型

引用:即别名,如int a=1;int &b=a;b就是a,所以必须初始化。

指针:如int =1;int *p=&a;,p存放a的地址——指针就是存放地址,或者说指针的值就是地址。值为4种情况:指向一个对象,对象的下一个位置,空指针,无效指针。

空指针的形式:int *p1 = 0, *p2 = NULL, *p3 = nullptr;

tips,建议指针立刻初始化。没有初始化会引起地址的错误。若不想立刻赋值就将其变为空指针。

void*指针,无须注意地址是什么类型的对象;无法访问指针内存空间中的对象。如int *p1 = &a; void *p2 = p1/*是对的*/     cout<<*p2;//是错的,不能访问。

tips,没有指向引用的指针(指针必须指向一个对象,引用不是),但是有对指针的引用,如int *p; int *&p1=p; p1=&a;

const(常量)

const必须初始化。默认状态下只在文件内有效,对所有文件有效:extern。初始化时可以用任意一个表达式,只要它能转化为引用类型。

const引用(常量引用)对const的引用。

1.不能修改引用。2.不能让非const作为const的引用

指针,const

指向const的指针只能存放地址不能更改。其形式为:const int *p1 = &a;指向的对象是一个const int的指针。

常量指针 const pointer:int *const p2 = &a;指针本身是一个常量。

顶层const:指针本身是一个常量(一般化:任意对象为const);底层const:指向的对象是个const。

常量表达式:值不会变;编译阶段得到计算结果。如const int a=func1();就不是。

constexpr类型:编译器将检查表达式是否为const。

constexpr int *p = a是一个指向整型的常量指针。

处理复杂类型:

1.typedef。typedef double x;x就是double。

2.auto。由编译器决定类型。如auto x=a+b;x为a+b的类型,值=a+b。

若引用为表达式右侧,则类型是引用的对象的类型。

auto会忽略顶层const,保留底层const

3.decltype()。不需要计算表达式的值。形式为:decltype(x) 表达式;x是表达式的名称。

tips,c++中看类型的方法可以是:typeid(x).name();

tips,对指针的使用会引起不同。如decltype(*p) c;这样是错的,假设p是一个int pointer(*p = &r;),则*p对其解引用,对指针解引用会得到对象,即int &。必须对c初始化。

还有一个struct,就不说了,大家都知道。

0 0