0%

C++_Primer 阅读笔记(一)

引言

随着C++版本的更迭,C++11中有许多从前未有的新语法从非标准库中加入到C++中。要是想要了解这些个新兴语法,必须的知识准备也还是需要的。

基础知识

C++最为基础的知识,莫不是类型、指针、引用、结构体、类。它们作为C++基础,深刻的理解掌握它们,才是写好C++程序的第一步。

基本类型

最为常用的类型,若是说来也不过就是: int、char、string、float、double、long。可要是针对不同类型所占有的字节长度,这怕是会让不少朋友啧舌。不过C++ Primer已经为大家准备好了,如下表所示:

类型含义最小尺寸
bool布尔类型未规定大小
char字符8位(1byte)
wchar_t宽字符16位(2byte)
char16_tUnicode字符16位(2byte)
char32_tUnicode字符16位(2byte)
short短整型32位(4byte)
int整型16位(2byte)
long长整型32位(4byte)
long long长整型64位(8byte)
float单精度浮点数6位有效数字
double双精度浮点数10位有效数字
long double扩展精度浮点数10位有效数字

有无符号类型区别

这是一个比较有意思的话题,因为常常使用的类型默认是有符号的,这让本没有存在感的无符号更增添一份陌生感。
除去布尔型与扩展的字符外,所有整型都可以使用unsigned关键字,使其变成一个无符号类型。对于字符型则相对特殊一些,它被分为三种: char、signed char、unsigned char。其实真的区别而言,它也就只有两个分类:一个有符号、一个无符号。因为char的类型会由编译器来确认。
无符号与有符号最大的区别就在于,一个8bit的unsigned char的类型范围是[0, 255],而signed char则是[-128, 127]。无符号至少保证了一点,那就是它的类型最小就是0,不存在负数的情况。
那么如何选择它们的使用呢?

  1. 明知类型不可能为负时,使用无符号类型
  2. 两个需要通信的机器,需要提前指定好char的类型

类型转换

主要的普通类型转换包换: 浮点数转整型、有符号类型转无符号类型。
对于第一种浮点数转整型,结果十分明了,那就是浮点数被转换成了一个整型,结果被作近似处理了。
对于第二种情况,就有一点特殊了,可以根据下例理解:

1
2
3
unsigned u = 10;
int k = -42;
std::cout << k + u << std::endl;

结果并非是我们所认为的-32,而是4294967264,过程:

  1. int是16位,将42转换成二进制取反再加1
  2. 将10转换成二进制
  3. 两个数相加,最后转换成十进制即可得到结果。

指针

这在C/C++中都是一个极为让人头痛的难点问题,若是想要理解指针,就要先读对它

1
2
3
int a = 0;
int *b = a;
std:cout << "a address value is :" << b << "b value is : " << *p << std::endl;

指针b的读法是: b是一个指向类型的指针,这个int*指针修饰了b这个对象。
指针有四类状态:

  1. 指向一个对象
  2. 指向紧邻对象所占空间的下一个位置
  3. 空指针,意味着指针没有指向任何对象
  4. 无效指针,除去以上情况的其它值。

const常量定义

一个被const所修饰的对象,其值是无法被修改的。但是它遇到指针时,就发生了一些奇妙的变化。
假定你拥有一个const int * p对象,若是对p值进行修改,那么你的右值也必须是一个const int*

const仅仅对当前文件生效,若要项目整体的使用,则需要在声明处理添加extern。

c++11新特性

通常我们会使用const定义一些公用常量用于使用,但在实际使用过程会发现,const定义的常量在使用可能并非是其原来的值。因此,若是真正的得到一个常量表达式。
C++11提供了一个constexpr关键字,保证了指定的对象是一个常量。若是想要使用函数去初始化,我们可以使用一种特殊的constexpr函数来实现。

auto类型推导,对于具有const属性的对象,在推导时会区分对待。若是对象是一个顶层const,则auto推导时则会舍弃它,若是底层const,auto会将其保留下来。
对于指针与引用,它们只是从属于某个类型,auto推导得到的也是这样基本的类型,而非int*这样的指针。

decltype类型指示符,它与表达式的关系最为密切。它的推导会使用表达式作为变量,而这个表达的结果值就是decltype返回其结果类型。使用它时,需要注意括号的使用

1
2
decltype((i)) d;
decltype(i) e;

d是int& ,必须要初始化。而e是int类型。导致这样的差异的是第一个表达的中的双层括号,它的结果永远都会是引用,因此必须要对变量进行初始化。

结语

指针与引用仍在C++中扮演着重要的角色,它们与c++中的关键字搭配,总是可以让程序得到进一步的效率提升。当然,用好它们仍需要不断的学习与长期的实践使用,不过在了解其机理后,做到恢恢乎于其间也不会太远了。