不知不觉已经写了好几篇博客,虽然质量不是很高但都是自己对编程的一些想法。因为c++时强类型语言(所有的变量只有先定义了才能使用),所以我们先来谈谈c++中的变量和基本类型。
一、基本内置类型
c++定义了一套包括算数类型和空类型在内的基本数据类型,其中算数类型包括字符、整型数、布尔值、浮点数。
这里我补充一句:c++标准只规定了各个类型的最小尺寸,同时允许编译器赋予这些类型的更大的尺寸。
1、类型转换
1.1、类型的自动装换
当在程序的某处我们使用了一种类型而其实对象应该取另一种对象时,程序就会发生自动转换。
算术类型的几种隐式转换
- 算术类型之间的转换,尽可能避免损失精度
- 非布尔类型会转换成布尔类型,0代表false
- 若算术运算或关系运算对象有多种类型,会转换成同一种类型
- 若给无符号类型赋值一个超过哦它范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数
- 给一个带符号类型赋值超过其范围时,其结果是未定义的
- 有符号类型会向无符号类型转换,无符号类型永远是大于 0 的
其他几种隐式转换
数组转换成指针
- 当数组被用作decltype关键字的参数,或者作为&、sizeof、typeid等运算符的运算对象时不会发生转换
- 用一个引用来初始化数组时也不会发生隐式转换
指针转换
- 常量整数0或者字面值 nullptr 能转换成任意指针类型
- 指向任意非常量的指针能转黄成 void*
- 指向任意对象的指针能转换成 const void*
- 具有继承关系的类,派生类指针能转换成基类指针
- 指针能转换成布尔类型
- 指向 T 的指针或引用能分别转换成指向 const T 的指针或引用
类类型的转换
- 若构造函数只接受一个实参,实际上定义了为此类类型的隐式转换机制(转换构造函数),但这种转换机制,编译器只允许执行一种类类型转换
1.2 类型强制转换
- static_cast
只要不包含底层const(顶层const和底层const辨析)的类型都可以用它进行强制类型转换
int a=5;
void* p = &a;
double* b = static_cast<double*>(p);
- const_cast
只能改变运算对象的底层const
const char* pc;
char* p = const_cast<char*>(pc);
- reinterpret_cast
通常为运算对象的位模式提供较低层次上的重新解释(这个本质上是依赖机器的,一般情况不推荐使用,本人也没用过)
int* ip;
char* *pc = reinterpret_cast<char*>(ip);
- C语言的强制类型转换
char* cp = (char*)ip;
二、变量
2.1 相关定义
- 变量提供一个具名的,供程序操作的存储空间。
- 对象是指一块能存储数据并具有某种类型的内存空间。
- 初始化是指在创建变量时赋予初始值
- 赋值是指把对象当前的值擦除,而以一个新值来代替
- 自动对象是指那些只存在于块执行期间的对象
2.2一些特点
定义于任何函数之外的变量被初始化为0
定义在函数内部的内置类型变量将不被初始化,其值是未定义的。(局部静态变量会被初始化为 0 )
局部变量会隐藏全局变量
变量的一些命名规则:不能连续出现两个下画线,不能再以下画线紧连大写字母开头,函数体外的标识符不能以下画线开头。(这些规则其实是为标准库留的一些名字)
一对花括号就代表一个作用域(enum类型除外)
2.3指针,引用
对于指针我觉得只要记住指针是一个对象,这个对象里存放的是另个对象的地址就行了
对于引用(引用不是对象)我们可以把他看成是他所指对象的别名,对引用的操作其实就是对原对象的操作
当我们面对一个比较复杂的指针或引用的声明语句时,从右到左阅读有助于我们理解
int* p;
// r是一个对指针p的引用
int *&r = p;
2.4const限定符
const类型在声明时就应被初始化
默认情况下,const对象仅在当前文件内有效
常量引用可以指向常量和非常量,非常量引用不能指向一个常量对象
int i = 1;
cont int ci = 1;
const int &r1 = i; //成功
const int &r2 = ci; //成功
const int &r3 = 1; //成功
r3 = 2; //错误:表达式必须是可修改的左值
int &r4 = i; //成功
int &r5 = ci; //错误
- 指针和常量
const char* cp = &p; //指针指向的对象不能改变
char* const cp = &p; //cp不能再指向别的对象
const char* const cp = &p; //两者都不能改变
2.5 constexpr和常量表达式
c++11中允许将变量声明为constexpr类型以便由编译器来验证变量是否是个常量表达式
函数内定义的变量不能用于初始化constexpr指针(静态变量除外),定义于函数体外的变量可以用来初始化constexpr变量(函数体外定义的变量地址是固定不变的)
constexpr把它所定义的变量置为顶层const
2.6 处理类型
- decltype 动态获取变量的类型
decltype((variable)) //返回的是引用类型
decltype(variable) //返回类型本身类型
auto 根据右侧表达式推测变量类型,auto定义的变量必须初始化,auto会忽略顶层const 保留底层const
typdef 给变量取别名
typdef double D; //将double取别名为D
D hei = 20.03;
感觉写的有点乱,不过收获挺大的,继续加油!!!!!