C++//变量和基本类型

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。如果直接替换:

const就和char结合,变成了指向常量字符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类型指示符

希望从表达式的类型推断出要定义的变量的类型,但是又不想用该表达式的值初始化变量。
编译器分析表达式的类型,却不计算他的值。
decltype(f()) sum=x;
编译器并不会实际调用f,只是使用f返回值的类型。
decltype会完整的返回类型,包括引用和顶层const。
对变量加括号,编译器就会把他当成表达式,可以作为赋值语句左值的特殊表达式。所以对加了括号的变量或者函数所返回的结果是引用格式。注意,运算式不会生效,因为运算式不可以是左值。
在这里插入图片描述
对指针的解引用形式通过decltype返回的值是引用格式。
在这里插入图片描述

2.9 自定义数据结构

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值