本文共 6617 字,大约阅读时间需要 22 分钟。
- C++语言定义了几种基本内置类型(如字符,整型,浮点数等),同时为程序员提供了自定义数据类型机制
. C++定义了一套包含算术类型和空类型在内的数据类型。其中,空类型不对应具体的值(例如打印相关内容)
2.1.1算术类型
算数类型分为两类:整型和浮点型注: 算术类型的尺寸在不同的机器上存在差别
布尔类型(bool)的取值是真(1)或假(0)
带符号类型和无符号类型编写程序时如何选择类型
类型的定义包含了数据与能参与的运算其中一种支持的运算将一种给定的类型转换为另一种相关类型
语句 | 含义 |
---|---|
bool b=42; | b为真(b=0) |
int i=b; | i=0 |
i=3.14; | i=3(i为int类型) |
double pi=i; | pi=3.0 |
unsigned char c=-1 | 假设char占1字节,c=255 |
signed char c2=256; | 假设char占1字节,c2未定义 |
对负数取模:
从数学角度解读: 取模运算时,对于负数,应该加上被除数的整数倍,使结果大于或等于0之后,再进行运算. 也就是:(-1)%256 = (-1+256)%256=255%256=255
//i为非0,程序继续执行,i值变为0
如果i的值为0,视为faulse;i的值不为0,是为true.求模公式:unsigned(z)=2 z所占的位数−(−z)
注:
形如42的值被称为字面值常量(光凭字面就能看出数值大小),其形 式和值决定了它的数据类型
整型和浮点型字面值
以0开头的通常为八进制
以0x或0X开头的通常表示十六进制
如表示20: 十进制: 20 八进制 : 024 十六进制:0x14默认情况下,十进制带符号,八进制和十六进制可能带符号也可能不带
十进制字面值的类型是能容纳下该数的int,long,long long中尺寸最小的那个(即int型)
八进制和十六进制中,字面值的类型是能容纳下该数的int,unsigned int,long,unsigned long,long long和unsigned long long中尺寸最小的
short没有相应的字面值
严格来说,十进制字面值不会为负,符号是强行添加的,仅仅是对字面值取负
浮点型字面值表现为以科学计数法表示的小数,指数部分用e或E标识
字符和字符串字面值 用单引号‘ ’括起来的单个字符成为char型字面值 由“ ”括起来的0个或多个字符则构成字符串型字面值字符串的面值实际上是由字符数组构成的
字符串实际长度比字面长度加1(含‘\0’)
字符串的分行书写:
转义序列 不能直接使用的两类字符: 1.不可打印的字符(如退格等其他控制符) 2.有特殊含义的字符(如单引号,双引号,问号,反斜线)。通常情况下用转义序列解决功能 | 符号 |
---|---|
换行符 | \n |
纵向制表符 | \v |
反斜线 | \\ |
回车符 | \r |
横向制表符 | \t |
退格符 | \b |
问号 | \? |
进纸符 | \f |
报警符 | \a |
双引号 | \" |
单引号 | \’ |
指定字面值的类型
通过添加指定的前缀或后缀,改变默认类型布尔字面值和指针字面值
数据类型决定变量的空间大小,布局方式和变量能参与的运算。变量和对象通常来说可以互换使用
变量定义的基本格式:类型说明符+变量名+(;) 其中变量名间以逗号分隔
什么是对象?
对象指一块能存储数据并具有某种类型的内存空间
初始值
当对象在创建是获得了一个特定的值,我们就称这个对象被初始化了注 :初始化和赋值尽管用的都是“=”,但它们是两个不同的操作。初始化是创建一个初值,而赋值是擦除当前变量的值,以一个新值来替代。
列表初始化
初始化的几条语句: int units-sold={0}; 称为列表初始化,无论是初始化还是赋新值,都可使用。 这种初始化有一个重要的特点:如初始值有丢失信息的风险,编译器会报错 由于double类型值强制赋予int类型,小数点后部分会自动省去,会丢失信息,故编译器会报错 默认初始化注:如试图在函数体内部由extern关键字标记变量,将引发错误
变量有且只能定义一次,但可被多次声明
标识符由字母,数字和下划线组成,必须以字母或下划线开头
变量命名规范
作用域:C++语句中,大多作用域以花括号分隔
名字main定义于花括号外,具有全局作用。而sum定义于花括号内,出了花括号就无法访问sum了,因此,sum拥有块作用域
建议当你第一次使用变量时再定义
嵌套的作用域
被包含的作用域称为内作用域 包含别的作用域的作用域称为外作用域如果函数用到局部变量,不宜与全局变量重名
一条声明语句由一个基本数据类型和一个紧跟其后的声明符列表组成。每个声明符命名了一个变量,并且指定了数据的基本类型
引用为对象起了一个新名字。通过将声明符写成&d的形式来定义引用类型,其中d为声明变量名
定义引用时,程序将两者的初始值“绑”在一起。一旦初始完成后,引用将和它的初始值一直绑在一起,并且无法令其绑定到另一个对象,因此,引用必须初始化引用即别名
引用的定义 允许一条语句中有定义个引用引用只能绑在对象身上,不能与字面值或某个表达式的计算结果绑在一起
指针是指向另一种类型的复合类型。与引用类似,实现了与其他对象的间接访问。与指针不同点:
1.允许对指针赋值和拷贝 2.指针无须定义和赋初值
定义指针类型声明符:* d,d为变量名,定义指针变量前必须加 *:
其中,&ival未引用对象,因此不能定义指向引用的指针,应看成指针指向ival的地址定义指针的几种形式:
定义指针时,二者的类型必须匹配指针值
1.指向一个对象 2.指向紧邻对象所占空间的下一个位置(无法访问) 3.空指针(无指向)(无法访问) 4.无效指针
利用指针访问对象
可用解引符“*”来访问该对象 对指针使用解引符,等于访问它的所指对象 空指针空指针不指向任何对象,以下为生成空指针的方法:
不能通过指针指向数值为0的变量来实现空指针
建议:初始化所有指针
赋值和指针指针可重新赋值,而引用不行
其他指针操作 指针在条件语句中的运行:void * 指针
void *是一种特殊的指针类型,可存放任意对象的地址不能直接操作void*指针所指对象,因为不清楚对象的类型
一条定义语句可定义不同类型的变量
int* p1,p2;中“*”仅修饰了p1,对p2无影响
声明两个整型指针方法:
指向指针的指针 通过的个数区分指针的级别。即 “ **”表示指针的指针,***表示指针的指针的指针指向指针的应用
因为引用本身并不是对象,因此,不能定义指向引用的指针。由于指针是对象,所以存在对指针的引用有时候我们希望定义一种值不变的变量,就可运用关键字const对变量类型加以限定,如想对const变量的值进行更改,将引发错误
初始化和const
默认状态下,const对象仅在文件内有效
对const的引用又称为对常量的引用。
对常量的引用不能修改它所绑定的对象
除const变量外,其他的引用均需遵守引用对象与被引用对象的类型相同
初始化和对const的引用
const变量引用的类型不一定需要const类型,而其他类型变量的引用必需是相同类型常量的引用相当于将const类型引用绑定了一个temp,temp的值等于被绑定对象。
当引用非常量时,此方法不成立
const指针
指针既可以是顶层const也可以是底层const
constexpr 变量
字面值类型
指针和constexpr
constexpr把其所定义的对象置为了顶层const1)typedef:
2) using指针,常量和类型别名
复合类型,常量和auto
使用auto时,编译器会以引用对象作为auto类型
auto一般会忽略掉顶层const的性质,而底层const性质会被保留
如需推断auto类型为顶层const,需提前指出const:设置一个auto类型引用时,初始值中的顶层常量属性仍旧保存
decltype类型:选择并返回操作类型(不返回值)
如果f被调用,就返回f的类型
decltype可返回顶层const类型
decltype和引用
- r是一个引用,但r+0是int类型
- 如果表达式内容是解引用操作将得到引用类型
格式:
1)struct+类名和类体 2){ //作用域(添加数据成员) } 3)“;”前可添加变量名 4) 以“;”结尾
自定义Sales_data类型,并声明变量:
类数据成员添加两个Sales_data对象
Sales_data对象输入数据
表示类中的成员的方法:
类名+“."+成员名
输出两个Sales_data对象的和
预处理器概述
转载地址:http://hfmki.baihongyu.com/