码迷,mamicode.com
首页 > 其他好文 > 详细

第2章 变量与基本类型(53~68)

时间:2021-04-24 13:57:31      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:依赖   说明   express   ESS   不能   ring   必须   指令   赋值   

1.const关键字可以定义一种变量,它的值不能被改变。因为const对象一旦创建后其值就不能被改变,所以const对象必须初始化。

2. 默认情况下,const对象被设为仅在文件中有效。如果想在多个文件中共享const对象,必须在变量的定义之前添加extern关键字。

3. 顶层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

4. 常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。

5. 声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。一般来说,如果你认定变量时一个常量表达式,就把它声明为constexpr类型。

  - constexpr int mf = 20;     // 20是常量表达式

6. 有两种方法可以定义类型别名。传统的方法是使用关键字typedef:

  - typedef int INT;

新标准规定了一种新的方法,使用别名声明(alias declaration)来定义类型的别名:

  - using SI = Sales_item;    // SI 是Sales_item的同义词

7. auto类型说明符让编译器通过初始值来推算变量的类型。显然,auto定义的变量必须有初始值。

  - auto item = val1 + val2;  // item初始化为val1和val2相加的结果,如果两个变量的类型是double,则item的类型就是double

8. decltype类型指示符作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不计算结果。

  - const int ci = 0, & cj = ci;

  - decltype(cj) x = 0;  // x的类型是const int

  - decltype(cj) y = x;  //y的类型是const int&,y绑定到变量x

  - decltype(cj) z;     // 错误:z是一个引用,必须初始化

9. 如果decltype使用的是一个不加括号的变量,则得到的结果就是该变量的类型;如果给变量加上了一层或多层括号,编译器就会把它当成是一个表达式。变量是一种可以作为赋值语句左值的特殊表达式,所以这样的decltype就会得到引用类型:

  // decltype的表达式如果 是加上了括号的变量(双层括号),结果将必是引用。而decltype(variable)结果只有当variable本身就是一个引用时才是引用。

  - decltype((i)) d;  //错误:d是int&,必须初始化

  - decltype(i) e;  // 正确:e是一个(未初始化的)int

10. 类体(结构体)右侧表示结束的花括号后必须写一个分号,这是因为类体后面可以紧跟变量名以示对该类型对象的定义,所以分号比不可少:

  - struct Sales{ }(name);

11. C++程序还会用到的一项预处理功能是头文件保护符,头文件保护符依赖于预处理变量。与处理变量有两种状态:已定义和未定义。#define 指令把一个名字设定为预处理变量,另外两个指令则分别检查某个指定的预处理变量是否已经定义:#ifdef 当且仅当变量已定义时为真,#ifndef 当且仅当变量未定义时为真。一旦检测结果为真,则执行后续操作直至遇到#endif 指令为止。

  使用这些功能就能有效的防止重复包含的发生:

  

#ifndef SALES_DATA.h
#define SALES_DATA.h  //为了避免与程序中的其他实体发生名字冲突,一般把预处理变量的名字全部大写
#include <string>
struct { 
     std::string bookNo;
     unsigned units_sold = 0;
     double revenue = 0.0 ;   
};
#endif

  第一次包含Sales_data.h时,#ifdef的检测结果为真,预处理器将顺序执行后面的操作直到遇到#endif为止。此时,预处理变量Sales_data变为已定义,且Sales_data.h也会被拷贝到程序中。后面再一次包含Sales_data.h 时,则#ifndef的检测结果为假,编译器将忽略#ifndef到#endif之间的部分。

  

第2章 变量与基本类型(53~68)

标签:依赖   说明   express   ESS   不能   ring   必须   指令   赋值   

原文地址:https://www.cnblogs.com/yanhualianye/p/14694922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!