C++ Primer抄书笔记(二)——变量和基本类型(下)
四、const限定符【引用/指针/顶层/常量表达式】
const对象值不变,必须初始化,能完成此type的大部分operation。
一般,多文件独立变量,编译初始化仅文件内有效;
除非,(条件:初值不是常量表达式 and 声明+定义 都有 extern);
//file.h
extern const int bufSize;
//file.cc
extern const int bufSize=fcn();
//引用reference to const
不可通过此reference改变object的值。
ps:这并不代表,不可以通过其他reference来改变object的值。
“常量引用”:引用bind对象,本身就不可能再去bind其他对象了,so引用必是const的;reference本身不是object,变不了。
const type & 可以绑定任何表达式,甚至可以打破类型限制——但非法;
double dVal=3.14;
const int &ri=dVal;
//原理
const int temp=dVal;
const int &ri=temp;
//temp,即 临时量 temporary
//指针
pointer to const 指向常量的指针:存const type的object的address只能用它。
ps:这并不代表,它只能存const type的object的address;即不变的是object,pointer随意。
so:reference/pointer to const 只是它们自以为自己 to const 了。
const pointer 常量指针:不变的是pointer,即不可以通过pointer来改变object的值。
ps:不变的是初始化了的address,object随意。
double dVal=3.14;
const double cd=3.141592;
const double *pcd=&dVal;
const double *const pcdc=&cd;
从右向左,pcdc是const pointer point to const double。
//顶层const
top-level const:必是object,任意type适用。
low-level const:引用和pointer to const。
const int ci=;
const int *pci=&ci;//low
const int &r=ci;//low
const int *const pci_=pci;//第一个const是low,第二个const是top
ps:low-level const 拷贝限制:二者都要底层const资格且可类型转换。【难搞哦】
//常量表达式const expression
编译时得值,且值不变。
角度刁钻,不方便使用,提供constexpr声明语句(可定义变量和函数)->供编译器提前验证其值是否是const expression。
constexpr的定义范围:算数类型、引用、指针(初值nullptr/0/pointer to const,仅对pointer有效即顶层);一般在函数体外,函数体内可定义有效范围超出函数体的变量【比较魔幻】
const int *p=nullptr; //p是 pointer to const int
constexpr int *q=nullptr;//q是 const pointer to int
ps:constexpr会把其object置为顶层const。
五、处理类型【类型别名/auto/decltype】
//类型别名type alias
typedef double wages;
typedef wages base,*p;
复合类型/常量:typedef定义的是类型别名,此声明符包含类型修饰符。
typedef char *pstring;
const pstring *ps;
const pstring cstr=;
const char *cstr=;//和楼上不是一个意思
C++11,别名声明alias declaration:
using SI=Sale_item;
//auto->让编译器替你分析(through 初始值)表达式所属类型。
auto定义的变量必须有初始值,且同一条声明中所有变量base type必须相同,类型修饰符不算。
auto i=,*p=&i;
auto sz=,pi=3.14;//错
auto会忽略顶层const,保留底层const。
int i=;
const int ci=i,&cr=ci;
auto d=&i; //d是指向int型pointer
auto e=&ci; //e是指向const int型pointer
const auto f=ci; //f是const int
auto &h=; //error:非常量引用不能bind字面值
const auto &j=; //常量引用可以bind字面值
auto k=ci,&l=i; //k是int,l是int型引用
auto &m=ci,*p=&ci; //m是const int型ci的引用,p是指向const int型 ci 的指针
auto &n=i,*p2=&ci; //error:n是int型i的引用,p2是指向const int型i的指针
设置一个类型为auto的引用时,初始值中的顶层常量属性任然保留。和往常一样,如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。【不懂】
//decltype->要表达式的返回类型,但不要值,使目标初始化。
编译器分析表达式并得到它的类型,但不算值。
若,表达式是变量,返回变量type(包括顶层const和引用):
const int ci=,&cj=ci;
decltype(ci) x=;
decltype(cj) y=x;//此处cj就是cj,而不是ci,即y绑定x
若,表达式不是变量,返回结果对应类型:
int i=,*p=&i,&r=i;
decltype(r+) b;//b是int型
decltype(*p) c;//error:c是int&,必须初始化
若,多加一对(),即decltype((xxx)),编译器会误以为其是表达式,而返回引用类型(因为赋值语句左值是变量):
decltype((i)) d;//error:d是int&,必须初始化
六、自定义数据结构【.../头文件/预处理器】
struct/class什么什么的。
ps:可为类内的data member提供一个类内初始值in-class initializer。
//头文件
包含那些只能被定义一次的实体。
隐式多次包含->预处理,保证程序安全正常工作。
//预处理器preprocessor->头文件保护符header guard
#include,编译前执行,改变部分程序
预处理变量:已定义/未定义,必须唯一,一般大写
#define:设定预处理变量;
#ifdef/#ifndef:变量已定义,为真/变量未定义,为真;
#endif:为止;
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data{
std::string bookNo;
unsigned units_sold;
double revenue=0.0;
};
#endif
C++ Primer抄书笔记(二)——变量和基本类型(下)的更多相关文章
- C++ Primer 学习笔记_5_变量和基本类型(续2)
变量和基本类型 七.枚举 枚举不但定义了整数常量集,并且还把它们聚集成组. 枚举与简单的const常量相比孰优孰劣, 通过以下一段代码. 一看便知: enum {input, output, a ...
- 《C++ Primer》读书笔记(二)-变量和基本类型
bool类型与其他类型转换时,0为false,1为true 浮点数赋值给整数的时候,进行近似处理,结果仅保留浮点数小数点之前的部分 整数赋值给浮点数的时候,小数部分记为0,如果该整数超过了浮点类型的容 ...
- 02.第二章_C++ Primer学习笔记_变量和基本类型
2.1 基本内置类型 2.1.1 算术类型 算术类型包括两类:整型和浮点型 2.2 变量 2.3 复合类型 2.4 const限定符 2.5 处理类型 2.6 自定义数据结构
- C++ Primer 第2章 变量和基本类型
C++ Primer 第2章 变量和基本类型 C Primer 第2章 变量和基本类型 1 基本内置类型 算数类型 类型转换 字面值常量 2 变量 变量定义 3 复合类型 引用d左引用 指针d 4 c ...
- C#笔记(二)变量
C#把数据类型分为两种 ● 值类型 ● 引用类型 从概念上看:其区别是值类型直接存储其值,而引用类型存储对值的引用 这两种类型存储在内存的不同地方:值类型存储在堆栈中,而引用类型存储在托管堆上 如果变 ...
- C++ Primer : 第二章:变量和基本类型(1)
变量和基本类型之第一篇:基本内置类型和变量 一. (1) C++定义了一套包括算数类型和空类型,这些类型有:布尔类型bool,字符类型char,宽字符类型wchar_t,Unicode字符char16 ...
- (C/C++学习笔记) 二十三. 运行时类型识别
二十三. 运行时类型识别 ● 定义 运行时类型识别(Run-time Type Identification, RTTI) 通过RTTI, 程序能够使用基类的指针或引用来检查(check)这些指针或引 ...
- (C/C++学习笔记) 九. 变量的存储类型
九. 变量的存储类型 ● 变量的存储类型(见附页) ● 注释 ①对于自动变量,它属于动态存储方式. 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式.由此看来,一个 ...
- C++ Primer 抄书笔记(二)——变量和基本类型(上)
一.基本内置类型 base build-in type[算数类型/类型转换/字面值常量] 基本内置类型(算数类型arithmetic type(整型integral type(字符,布尔bool),浮 ...
随机推荐
- 我的开源权限管理项目BeCore (基于.net core开发)
首先 谢谢大家还记得我.. 新年快乐 祝大家工作顺利 事事顺心 人见人爱 车见车载 冬不寒 下雨有伞 全身哪都不疼 就是有人疼 ~~ Github地址:https://github.com/baby8 ...
- Creating Form Elements --Using BeginForm and EndForm 使用内建的Form辅助器方法 精通ASP.NET MVC 5
Using the BeginForm and EndForm Helper Methods in the CreatePerson.cshtml File
- Windows 系统安装 Python 3.8 详解
安装 Python 很简单,但是其中的很多细节未必大家都清楚,趁着给自己安装最新 3.8 版本,把整个过程详细记录下. Python or Anaconda 本节是专门写给一些小白,Python 还没 ...
- 深入理解Java 中SPI 制
深入理解Java 中SPI 制 概述 SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比 ...
- 痞子衡嵌入式:嵌入式里堆栈原理及其纯C实现
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式里堆栈原理及其纯C实现. 今天给大家分享的这篇还是2016年之前痞子衡写的技术文档,花了点时间重新编排了一下格式.栈这种结构在嵌入式 ...
- .net core3.1 web api中使用newtonsoft替换掉默认的json序列化组件
在微软的文档中,有着较为详细的替换教程 https://docs.microsoft.com/zh-cn/aspnet/core/web-api/advanced/formatting?view=as ...
- vuex之getter(二)
说明 使用vue,如果想对data数据派生一些状态,我们就用到计算属性或者侦听器,同样vux想要派生state中的一些状态,可以在store中定义一个getters属性,它相当于state的计算属性. ...
- 学习记录(Python列表)
列表(List)是Python语言中最通用的序列数据结构之一,列表是一个没有固定长度的,用来表示任意类型对象的位置相关的有序集合.列表中的数据项不需要具有相同的数据类型 列表的基本操作: 1.创建列表 ...
- python学习Day03
[主要内容] 1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 ...
- 微信小程序框架分析小练手(一)——猫眼电影底部标签导航制作
旧版猫眼电影底部有4个标签导航:电影.影院.发现.我的,如下图所示: 一.首先,打开微信开发者工具,新建一个项目:movie.如下图: 二.建立如下的一些目录: 三.将底部标签导航图标的素材放到ima ...