C++的基本内置类型包括算术类型和空类型。

1.字面值常量

如果两个字符串字面值位置紧邻且仅由空格,缩进和换行分割,它们仍是一个整体。

可以通过添加表2.2指定的前缀和后缀来指定字面值的类型。

不能用字面值来初始化非常量引用

2.变量

2.1 初始化

初始化和赋值的含义是不同的,初始化是指创建对变量的时候赋予的初始值,赋值是指 把对象当前值删除,以一个新的值代替。

列表初始化是C++11标准的一部分,可用于初始化以及赋值。当用于内置类型的变量时,如果有丢失信息的风险,则会报错。下述四条语句皆可完成units_sold的初始化。

  默认初始化是指如果变量没有指定初始值所进行的初始化操作。

内置类型的变量未被初始化:

类型 默认初始化方法
定义于函数体外 初始化为0
定义于函数体内 不被初始化,试图拷贝或者访问会出错
类内 类各自决定初始化对象的方式。绝大多数类会给未初始化对象提供合适默认值 ,如string类,未初始化会生成空串,但是,有的类需要显式初始化,如果创建了对象而未初始化,将报错

2.2 变量定义和声明的关系

声明使得名字为程序所知,规定了变量的类型和名字。
定义负责创建与名字关联的实体。规定了变量的类型和名字,同时申请存储空间,并可能为变量设置一个初始值。

①平时使用的int i;string j;等等都是声明的同时定义了,如果想要声明一个变量而不去定义它,在变量名前面添加extern关键字,即 extern int i;
②任何包含了显示初始化的声明都将变成定义,如extern int i=5;这句就是一句定义。
③不能在函数内部初始化extern的变量,extern定义的变量必须是全局的,这样才可能在其他文件中使用,所以,不能再语句块里定义
④变量只能定义一次,但是可以多次声明。
C++是一种静态类型语言,即在编译阶段检查类型。

2.3 变量命名规范

1.变量名为小写。如果标识符由多个单词组成,第一个小写,后续的每个单词的第一个字母大写。
2.用户自定义的类名由大写开头。

2.4 名字的作用域

所有使用到的名字都会指向一个特定的实体,如函数,变量,类型等等。
定义于所有花括号之外的名字具有全局作用域。如main

2.5 复合类型

复合类型是指基于其他类型定义的类型。

引用 指针
引用是给对象起的别名,正应为如此,无法定义引用的引用。(引用本身不是对象) 指针是指向另外一种类型的符合类型。指针本身就是一个对象,指针无需在定义时赋值,在函数内定义的指针如果未初始化,将拥有一个不确定的值
引用和初始值绑定在一起,而不是拷贝初始值 nullptr是一种特殊的字面值,可以被换算成任何类型的指针
除了两种例外,引用的类型要和绑定的对象一样
引用一旦绑定对象,无法再绑定新的对象

*,&是类型修饰符。类型修饰符是**声明符(变量名)**的一部分

2.6 const限定符(跟在类型符或者标识符前)

const的常量特征仅在执行改变变量的操作时才会发挥作用。再初始化时,没有const的限制。初始化后,其他变量可以读取、拷贝const限定变量的值。
const仅在文件内有效。因为涉及多文件使用该const对象时,每个文件都要定义一次该对象,否则访问不了const的值,如果不设置为文件内有效,会导致重复定义。如果不想每个文件都定义,一种解决的方法是,添加extern关键字,这样只需定义一次,其他文件也能访问了。

2.6.1 对常量的引用(常量引用):

指的是该常量引用认为自己是对常量的引用。初始化常量引用时,允许任意表达式作为初始值,只要表达式的结果能转化为引用的类型即可。因为在引用过程中,被引用对象会先被赋值给一个临时常量,然后再赋值给常量引用。注意字面值隐含了是常量的信息。

那为什么非常量的引用就必须要求引用类型和被引用对象一致呢。假设常规的引用也执行和上述类似的过程,就会出现非常量引用引用的对象是一个临时常量,在试图通过常规引用修改对象时会出错,所以编译器就禁止了这类行为。

事实上,如上所述,被常量引用的对象可能不是常量,所以可能修改该对象,但是不能通过对他的常量引用修改。

2.6.2 指向常量的指针和常量指针

允许指针类型和被指向的对象不一致。指向常量的指针允许指向常量的指针指向一个非常量的对象。

指向常量的指针和对常量的引用是差不多的东西。都是“自以为”指向了常量,可事实上可能不是常量。

常量指针是指指针是常量。常量指针必须初始化。形如:

要判断变量到底是什么类型,从变量名开始,从右向左解读即可。注意把限定符和类型修饰符先与基本数据类型结合在一起。

2.6.3 底层const和顶层const

顶层const表示指针本身是一个常量,底层const表示指针所指的对象是一个常量。

一个常量可以既是顶层const又是底层const:

在进行拷贝操作时,拷入拷出对象必须具有相同的底层const资格。对顶层const则没有这个限制。换句话说,本身是不是const不影响,所指向的是不是const必须一致。

除此以外如果二者数据类型可以相互转换(一般来说,非常量可以转化为常量,反之则不行),拷贝也能成功(2.6.1节):
1.指向非常量的指针可以拷贝给指向常量的指针。
2.非常量可以拷贝给常量引用。

示例如下:

2.7 constexpr与常量表达式

常量表达式是指值不会改变,并且在编译阶段就能获得计算结果的表达式。使用constexpr,你可以创建一个编译时的函数,它将为你计算出你需要的数值,用户的电脑将不需要做这些工作。
C++11规定,允许将变量设置为constexpr,这样的变量必须是常量,并且由常量表达式初始化。

2.7.1 字面值类型

声明constexpr时用到的类型必须进行限制,必须使用比较简单,值显而易见、容易得到的类型,称为“字面值类型”。
算术类型,引用和指针都是字面值类型,自定义类,string等等不属于字面值类型。指针作为字面值类型需要初始化为0或者nullptr,或者是存储于某个固定地址的对象。

字面值类型常量也称为字面值。

2.7.2 指针与const

注意constexpr只会把指针定义为顶层const。

2.8 类型的相关操作

2.8.1 类型别名

typedef作为声明语句的基本数据类型的一部分。含有typedef的语句不再是定义变量而是类型别名。

关键字using作为别名的开始,其后紧跟别名号和等号,其作用是把等号左侧的名字规定成等号右侧的别名

起了别名之后不能直接替换类型。比如:

可以看到pstring类型是指向char的指针,假设const限定符,就是指向char的常量指针,所以cstr是一个const指针,并且指向char。如果直接替换:


typedef对数组起别名的过程稍微有点特殊,下表符号再新类型名右侧:

2.8.2 auto

auto定义的变量必须有初始值,因为auto是通过初始值来计算类型的。
auto可以用于在一条语句中声明多个变量,但是这多个变量必须保证类型一致。
编译器推断出来的auto类型可能和真实类型有偏差:
1.auto用引用进行初始化是。auto的类型是引用的对象的类型。
2.auto会忽略掉顶层的const,保留底层const。如果希望auto的类型是顶层const,需使用const auto。

2.8.3 decltype类型指示符

希望从表达式的类型推断出要定义的变量的类型,但是又不想用该表达式的值初始化变量。
编译器分析表达式的类型,却不计算他的值。

编译器并不会实际调用f,只是使用f返回值的类型。
decltype会完整的返回类型,包括引用和顶层const。
对变量加括号,编译器就会把他当成表达式,可以作为赋值语句左值的特殊表达式。所以对加了括号的变量或者函数所返回的结果是引用格式。注意,运算式不会生效,因为运算式不可以是左值。

对指针的解引用形式通过decltype返回的值是引用格式。

2.9 自定义数据结构

类内初始值可用花括号,等号进行,但是不能使用括号。

预处理器:
1.处理#include。当预处理器看到#include就会用指定的头文件内容去代替。
2.头文件保护符。#define指令将一个名字设置为预处理变量,#ifdef当且仅当变量定义时为真,ifndef当且仅当变量未被定义时为真。一旦检查结果为真,则执行后续操作直到遇到#endif指令为止。
头文件保护符的作用:当两个程序同时包含了同一个头文件,编译器就会对这个文件拷贝到两个程序内,这回导致重复编译。有了头文件保护符,当头文件被某一个程序编译过了,在被再一次读取时,就会制止后续行为。
define定义函数:
#define 函数名(参数列表) 新定义函数体
函数体无需加括号,如果函数体有多行,用\分割每行。

C++//变量和基本类型相关推荐

  1. Java定义接口变量为接收类型有什么好处(面向接口编程)

    个人理解:定义接口变量为接收类型属于面向接口的编程,通过接口的抽象能减少类之间的耦合,增加可复用性. 面向接口编程: 一种规范约束 制定者(或者叫协调者),实现者(或者叫生产者),调用者(或者叫消费者 ...

  2. java 定义类变量初始化吗_Java的变量有哪些类型?变量如何定义?如何初始化?请说明理由并举例_学小易找答案...

    [单选题]根据金杯萃取理论,咖啡萃取比较适合的参数是: (2.9分) [判断题]高分化的鳞状细胞癌恶性程度高,低分化的鳞状细胞癌恶性程度低. ( ) [简答题]第 3-4 节之间的关系是什么?在全诗结 ...

  3. 【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )

    文章目录 前言 一.Groovy 动态语言 二.Groovy 中的变量自动类型推断及动态调用 三.Java 中必须为变量指定其类型 前言 Groovy 是动态语言 , Java 是静态语言 ; 一.G ...

  4. decltype判断变量或表达式类型

    文章目录 1 decltype判断变量或表达式类型 1 decltype判断变量或表达式类型 在C++11中增加了判断变量或表达式类型的供能,decltype (expr是变量或表达式expr的已声明 ...

  5. Python变量和对象类型速记手册

    变量和对象类型 Python中关于变量和对象类型有一些重要的概念: 变量不受类型约束 变量并不是一块内存空间的标签,只是对象的名字,是没有类型的,相当于一个可以指向任何对象void指针.类型属于对象, ...

  6. C++ Primer 5th笔记(2)chapter 2变量和基本类型:constexpr 、auto、类型别名、decltype

    1.constexpr和常量表达式 1.1 常量表达式 定义:变量的值在编译器的时候就可以得到是一个常量 eg. const int i = 0; 1.2 constexpr变量 让编译器来验证变量的 ...

  7. C++ Primer 5th笔记(2)chapter 2变量和基本类型:变量声明、关键字

    0. 几个零星知识点 . 嵌套作用域:局部变量会覆盖全局变量 . char 在有些机器有符号,有的无符号. . 标识符大小写敏感. 1.变量声明和定义 c++ 将声明和定义分开来. 声明 extern ...

  8. Chapter2(变量和基础类型)--C++Prime笔记

    数据类型选择的准则: ①当明确知晓数值不可能为负时,选用无符号类型. ②使用int执行整数运算.在实际应用中,short常常显得太小而long一般和int有一样的尺寸.如果运算范围超过int的表示范围 ...

  9. C++知识总结(1)--变量和基本类型

    最近打算看看<C++ primer>,重新复习C++的一些知识点,同时会添加部分在做牛客网编程题目时候记录的知识点. 变量和基本类型 endl操纵符的效果是结束当前行,并将与设备关联的缓冲 ...

  10. 《C++ Primer 5th》笔记(2 / 19):变量和基本类型

    文章目录 基本内置类型 算术类型 内置类型的机器实现(类型在物理层面上的说明) 建议:如何选择类型 类型转换 建议:避免无法预知和依赖于实现环境的行为 算术表达式里使用布尔值 含有无符号类型的表达式( ...

最新文章

  1. android 使用jar里 aidl,Android Studio中用gradle打包带AIDL文件的jar文件
  2. 同源策略Same-origin policy
  3. 整合swagger2生成Restful Api接口文档
  4. 简述深度学习预训练和正则化
  5. 我的Android进阶之旅------Android MediaPlayer播放网络音频的实例--网络mp3播放器
  6. bat复制文件到指定目录同名_scp复制文件时排除指定文件
  7. 信安精品课:第3章密码学基本理论精讲笔记
  8. eclipse properties 中文显示编码_JMeter点道为止系列(1)JMeter配置文件jmeter.properties常用配置项...
  9. 智能一代云平台(三):15年上半年维护总结
  10. 云网络开山之作,揭秘云上高速公路的十年技术成果!
  11. 家庭记账本开发进度4
  12. AMF序列化为对象和AMF序列化为二进制字节流
  13. 计算大数阶乘--VB Script 版
  14. python 文件夹操作_Python之路(第九篇)Python文件操作
  15. 华硕台式计算机光盘怎么启动不了,华硕台式机U盘启动不了怎么回事
  16. [转] prove, verify, bear out, demonstrate, confirm, validate, testify, certify 的区别
  17. 为什么国外程序员的创造力比中国程序员强?
  18. ansible-playbook changed_when使用
  19. 数据挖掘十大经典算法个人总结
  20. 上海市“专精特新”中小企业认定条件及奖励政策解读

热门文章

  1. Map练习题:求地铁票价
  2. 开始搞点其他的事-成立北京租房群(霍营、回龙观、西二旗、望京)
  3. 不用找,你想要的建筑场景游戏素材素材都在这里
  4. C语言中利用Swap函数交换变量a,b
  5. dubbo的常用容错机制
  6. 三文鱼媲美。传奇si服
  7. bing搜索分析网站的方法
  8. Scala一种编程语言
  9. 前端 | 前端设计设计及代码收集
  10. 禁止应用和adb安装APK