C++学习笔记(2)

4次阅读

共计 4154 个字符,预计需要花费 11 分钟才能阅读完成。

变量和基本类型

基本内置类型

算数类型: 包括整型和浮点型

                                       C++ 算术类型
                                       
类型                                      含义                                   最小尺寸
bool                                    布尔类型                                 未定义
char                                    字符                                     8 位
wchar_t                                 宽字符                                   16 位
char16_t                                Unicode 字符                              16 位
char32_t                                Unicode 字符                              32 位
short                                   短整型                                   16 位
int                                     整型                                     16 位
long                                    长整型                                   32 位
long long                               长整型                                   64 位
float                                   单精度浮点数                              6 位有效数字
double                                  双精度浮点数                              10 位有效数字
long double                             扩展精度浮点数                            10 位有效数字
                                

其他字符类型用于扩展字符集,char 在一些机器上是有符号的,在另一些机器上又是无符号的
带符号类型和无符号类型

 带符号:signed
无符号:unsigned

类型转换

1、将一个非布尔类型的算术值赋给布尔类型时,初始值为 0 则结果为 false,否则结果为 true
2、将一个布尔值赋给非布尔类型时,初始值为 false,则结果为 0,初始值为 true,则结果为 1
3、将一个浮点数赋给整数类型时,结果值将仅保留浮点数中小数点之前的部分
4、将一个整数值赋给浮点类型时,小数部分记为 0,若该整数所占空间超过浮点类型容量,精度会有损失
5、赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数
6、赋给带符号类型一个超出它表示范围的值时,结果是未定义的 

字面值常量

整型和浮点型字面值

 整型字面值:十进制数、八进制数(以 0 开头的整数)、十六进制数(以 0x 或 0X 开头的整数)浮点型字面值:以一个小数或以科学计数法表示的指数,其中指数部分用 E 或 e 标识 

字符和字符串字面值

 字符串字面值实际上是由常量字符构成的数组,编译器在每个字符串结尾处添加一个空字符(‘\0’)

转义序列

 有两类字符不可直接使用,一类是不可打印字符,没有可视的图符;另一类是具有特殊含义的字符,需要用到转义序列,以 '\' 作为开始
                                        常见转义序列
                            
换行符       \n                 横向制表符       \t                      报警(响铃)符      \a
纵向制表符   \v                 退格符           \b                      双引号              \"反斜线       \\                 问号             \?                      单引号              \'
回车符       \r                 进纸符           \f

也可使用泛化的转义序列,形式为:x 后紧跟 1 个或多个十六进制数字,或者后紧跟 1 个、2 个或 3 个八进制数字,数字部分表示的是字符对应的数值,若后面跟着的八进制数字超过 3 个,只有前 3 个数字与构成转义序列

                                指定字面值的类型
                                  
前缀                  含义                                          类型
 u                   Unicode 16 字符                               char16_t
 U                   Unicode 32 字符                               char32_t
 L                   宽字符                                        wchar_t
 u8                  UTF-8(仅用于字符串字面常量)char
 
            整型字面值                                   浮点型字面值
后缀                  最小匹配类型              后缀                  类型
u or U                unsigned                f 或 F                  float
l or L                long                    l 或 L                  long double
ll or LL              long long
布尔字面值:true 和 false
指针字面值:nullptr

变量

变量定义的基本形式:

 类型说明符  一个或多个变量名组成的列表,变量名以逗号分隔,最后以分号结束 

初始化:

 创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替 

声明:

 使名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明,在变量名前添加关键字 extern

定义:

 负责创建与名字关联的实体,任何包含了显示初始化的声明即成为定义 

标识符

由字母、数字和下划线组成,必须以字母或下划线开头,长度没有限制,对大小写敏感

                                   C++ 关键字
                                
alignas         continue            friend          register            true
alignof         decltype            goto            reinterpret_cast    try
asm             default             if              return              typedef
auto            delete              inline          short               typeid
bool            do                  int             signed              typename
break           double              long            sizeof              union
case            dynamic_cast        mutable         static              unsigned
catch           else                namespace       static_assert       using
char            enum                new             static_cast         virtual
char16_t        explicit            noexcept        struct              void
char32_t        export              nullptr         switch              volatile
class           extern              operator        template            wchar_t
const           false               private         this                while
const_cast      for                 public          throw

复合类型

基于其他类型定义的类型

引用

为对象起了另一个名字,引用类型引用另外一种类型,通过将声明符写成 &d 的形式来定义引用类型,d 是声明的变量名,引用必须初始化,引用并非对象,所有引用的类型都要和与之绑定的对象严格匹配,引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑在一起

指针

1、指针本身就是一个对象,允许对指针赋值和拷贝,在指针的生命周期内可以先后指向几个不同的对象
2、指针无需在定义时赋初始值
3、指针存放某个对象的地址,要想获取该地址,需要使用取地址符(操作符 &)4、指针值:(1) 指向一个对象
    (2) 指向紧邻对象所占空间的下一个位置
    (3) 空指针,意味着指针没有指向任何对象
    (4) 无效指针,也就是上述情况之外的其他值
5、如果指针指向了一个对象,则允许使用解引用符(操作符 *)来访问该对象
6、空指针:不指向任何对象,得到空指针最直接的办法就是用字面值 nullptr 来初始化指针,nullptr 是一种特殊类型的字面值,可以被转换成任意其他的指针类型
7、C++11 之前使用 NULL 的预处理变量来给指针赋值,变量在头文件 cstdlib 中定义,值就是 0,由预处理器负责管理
8、类型相同的合法指针可用 == 操作符和!= 操作符来进行比较
9、void* 指针用于存放任意对象的地址,可用来和别的指针比较、作为函数的输入或输出,或者赋值给另一个 void* 指针,但不能直接操作 void* 指针所指向的对象 

指向指针的指针

 通过 * 的个数可以区分指针的级别,** 表示指向指针的指针,*** 表示指向指针的指针的指针 

指向指针的引用

int i = 42;
int *p = &i;
int *&r = p;
从右向左读 r 的定义,&r 表示 r 是一个引用,int * 表示 r 所引用的对象的类型是指向 int 类型的指针 

const 限定符

1、const 对象一旦创建后其值就无法再改变,因此 const 对象必须初始化
2、默认状态下,const 对象仅在文件内有效
3、如果想在多个文件之间共享 const 对象,必须在变量的定义之前添加 extern 关键字 

const 引用

 对常量的引用
const int ci = 1024;
const int &r1 = ci;          // 正确:引用及其对应的对象都是常量
r1 = 412;                    // 错误:r1 是对常量的引用
int &r2 = ci;                // 错误:试图让一个非常量引用指向一个常量对象
对 const 的引用可能引用一个并非 const 的对象 

指针和 const

const double pi = 3.14;             //pi 是个常量,他的值不能改变
double *ptr = π                  // 错误:ptr 是一个普通指针
const double *cptr = π           // 正确:cptr 可以指向一个双精度常量
*cptr = 42;                         // 错误:不能给 *cptr 赋值 

const 指针

 常量指针:将 * 放在 const 之前,必须初始化,初始化后不能再指向其他对象
int errNumb = 0;
int *const curErr = &errNumb;           //curErr 将一直指向 errNumb
const double pi = 3.14159;
const double *const pip = π          //pip 是一个指向常量对象的常量指针 

顶层 const

 顶层 const 表明指针本身是个常量,底层 const 表明指针所指的对象是一个常量
int i = 0;
int *const p1 = &i;                     // 不能改变 p1 的值,这是一个顶层 const
const int ci = 42;                      // 不能改变 ci 的值,这是一个顶层 const
const int *p2 = &ci;                    // 允许改变 p2 的值,这是一个底层 const
const int *const p3 = p2;               // 靠右的 const 是顶层 const,靠左的是底层 const
const int &r = ci;                      // 用于生命引用的 const 都是底层 const

constexpr 和常量表达式

 常量表达式:不会改变并且在编译过程就能得到计算结果的表达式
一个对象(或表达式)是不是常量表达式由他的数据类型和初始值共同决定
在 C ++11 中,允许将变量声明为 constexpr 类型以便由编译器来验证变量的值是否是一个常量表达式,声明为 constexpr 的变量一定是一个常量,而且必须用常量表达式来初始化 

指针和 constexpr

constexpr 仅对指针有效,与指针所指的对象无关 

类型别名

 传统方法使用关键字 typedef
typedef double wages;                   //wages 是 double 的同义词

使用别名声明定义类型的别名:using SI = Sales_item;                  //SI 是 Sales_item 的同义词

typedef char *pstring;
const pstring cstr  ≠  const char *cstr
声明语句中用到 pstring 时,基本数据类型是指针,用 char* 重写了声明语句后,数据类型就变成了 char,* 成为了声明符的一部分 

auto 类型说明符

auto 让编译器通过初始值来推算变量的类型,auto 定义的变量必须有初始值
auto 一般会忽略掉顶层 const,同时底层 const 则会保留下来 

decltype 类型指示符

 选择并返回操作数的数据类型,编译器分析表达式并得到它的类型,却不实际计算表达式的值
decltype(f()) sum = x;              // sum 的类型就是函数 f 的返回类型
如果 decltype 使用的表达式不是一个变量,则 decltype 返回表达式结果对应的类型
如果表达式的内容是解引用操作,则 decltype 将得到引用类型
对于 decltype 所用的表达式来说,如果变量名加上了一对括号,则得到的结果与不加括号时会有所不同,如果不加,则得到的结果就是该变量的类型,如果添加了一层或多层括号,编译器就会把它当成一个表达式
decltype((variable)) 的结果永远是引用,而 decltype(variable) 结果只有当 variable 本身就是一个引用时才是引用 
正文完
 0