c++基础整理(基本类型和变量)
基本内置类型
c++中,基本的内置类型有两种:
算数类型
算数类型分为整形和浮点形两种,整形包含了大多数的类型如bool和char都是属于整形。 基本的类型有:
- int 整形
- long 长整型
- long long 长整型
- bool 布尔类型
- char 字符
- wchar_t 宽字符
- char16_t Unicode字符
- char32_t Unicode字符
- short 短整型
- float 单精度浮点数
- double 双精度浮点数
- long double 扩展精度浮点数
字面值类型
形如数字4,字符’a’的被称为字面值类型。字面值类型有各自对应的基本类型。
转义序列
字面值类型中有一类比较特殊的是转义序列,转移序列是不可打印的。
类型转换问题
将浮点型转换为整形时,会直接去掉小数部分。类型转换时原本的值如果超过转换的类型所能表示的最大长度时,程序会发生不可预测的问题。 如果是非0的值转换为bool型时都是true,如果是0则为false。
变量
初始化
c++初始化变量的方式有多种
int i=0;
int i(0);
int i{0};
上面的初始化的第三种方式称为列表初始化,列表初始化在发生数据精度丢失时会给出警告。
double i=0.1;
int n{i};
上面的编译无法通过。 初始时可以默认初始,默认初始化即给予默认的值,如果默认初始化发生在函数内,则不会初始化,如果使用不被初始化的值将会发生错误
声明和定义
声明的意思是告诉程序该变量存在,可以单独的声明变量不定义变量。
extern int i;//声明变量
int i;//声明并且定义变量
如果想要在一个文件中调用另一个文件中的变量,则需要在调用的那个文件中声明要调用的变量,在原本的文件包含的头文件中也要声明该变量。
标识符
c++内置了一些标识符,定义变量的时候不能和标识符同名。
变量作用域
变量定义的时候拥有其作用域,比如在一个函数中时,其作用域就是这个函数内。 变量的的作用域可以进行嵌套,嵌套时存在外层作用域和内层作用域。
int i=0;//外层作用域的i
int main(){
int i=1;//内层作用域的i
std::cout<<i<<std::endl;//内层作用域的i 输出1
std::cout<<::i<<std::ensl;//外层作用域的i 输出0
}
在内层作用域中,会先寻找最近作用域中变量。可以使用::来访问外层作用域的变量。
复合类型
复合类型时建立在基础类型之上的类型。
指针
指针是一种灵活且强大的数据类型,它允许直接对系统的内存进行操作,正因为可以直接对内存可以操作,所以乱用指针会造成巨大的隐患以及严重时使得系统崩溃。
指针的定义
int i=0;
int *p=nullptr;//空指针
int *m=&i;//将m指向i
在定义指针时可以让其指向空指针NULL,NULL是C语言中定义的,在c++中还提供了另一种空指针nullptr。nullptr是一种特殊的字面值常量,常常为0; 在初始化指针时可以使用&来获取变量的地址赋值给指针。 对于指针,指向的是变量,指针自己本身表示的是所指的变量的地址。可以通过解引用来访问所指向的地址。
int i=0;
int *m=&i;
*m=1;//对指针解引用 i的值变为1
引用
引用相当于变量的别名,可以通过引用来修改变量。
引用的定义
int i=0;
int &m=i;//对i进行引用
引用有点类似于指针,但是却又不同于指针。指针是存储地址,通过地址来访问所指向的变量。引用则是变量的别名,直接可以访问变量来修改变量。
const类型修饰符
const用于修饰那些不会改变的变量。试图对const修饰过的变量进行修改时编译器会报错。
const和引用
const引用会使得不能通过当前的别名修改变量,const引用可以引用非const变量。
const int n=0;
const int &q=n;
int i=0;
const int &m=i;
const引用可以绑定非本类型的变量,在绑定时编译器会隐式声明一个和引用类型一样的临时两来使绑定正常。
double i=1.1;
const int &m=i;
上面段代码会转换成:
double i=1.1;
const int temp=i;//临时两temp
const int &m=temp;
const和指针
指针本身表示了变量地址,也能表示所指向的变量,所以指针的const有两层含义,第一层含义是指针本身不可变,另一层是所指向的变量不可变。
int i=0;
const int *p=&i;//所指向的变量的值不能改变,即不能通过指针更改变量
int * const cp=&i;//指针本身是const,不能改变指针本身的指向
const int *const ccp=&i;//不能更改指向且不能更改所指向的变量的值
const指针也可以指向非常量的变量,这一点和引用一样。
顶层const和底层const
对于指针,存在顶层const和底层const。广泛的,顶层const表示本身不可变,底层const表示所指向的内容不可变。
const int i=0;//顶层const
const int *pi=&i;//底层const
int *const tpi=&i;//底层const
const int *const ccp=&i;//既是顶层又是底层const
有一点不同的是,用于引用的const都是底层const。
constexpr
c++中有常量表达式的概念,常量表达式即在编译的过程中就可以确定固定的值,不同于const,const的值可能在运行时才会决定是多少。 常量表达式可以用constexpr来声明,编译器会检查是否可以在编译期间获得具体值。 指针如果要是constexpr类型,则必须初始化为nullptr类型。
处理类型
有时候我们不知道我们所要定义的类型时,可以通过一些关键字来自动获取。
auto
auto会自动的获取当前变量的类型来定义变量。 auto在推断变量类型时,一般会忽略掉顶层const,保留底层const;
const int i=0;
auto in=i;//in为const int
auto ip=&i;//ip为const int *
decltype
decltype通过判断类型来定义变量,不同的一点是,decltype可以判断函数的返回值来定义变量
int a=0,b=1;
decltype(a+b) i;//判断a+b的类型
decltype(string::size()) strl;//size_t类型
如果对括号内的处理内容再加上一层括号的话,就会转成引用类型。
int a=0,b=1;
decltype((a+b)) i=&a;//i为int &类型
|