S02变量和基本类型

来源:互联网 发布:深圳阿里云大厦地铁 编辑:程序博客网 时间:2024/06/05 18:41

S02变量和基本类型


一、基本内置类型

1、基本内置类型:算数类型、空类型

2、整型字面值:

  • 0开头代表八进制,0x开头代表十六进制;
  • 一般,十进制字面值是有符号数,类型是int/long/long long中能容纳下并且最小的那一个;
  • 八进制和十六进制字面值有无符号不定,类型是int/unsigned int/long/unsigned long/long long/unsigned long long中能容纳下并且最小的那一个;
  • 如果相关联的类型中最大的都放不下将产生错误

3、浮点型字面值:一般,double

二、变量

1、对象(object):一块能存储数据并具有某种类型的内存空间

2、初始化与赋值是两个不同的操作

3、声明(declaration)使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明

4、定义(definition)负责创建与名字关联的实体,变量仅能被定义一次但可以被声明多次

extern int ix = 1024;   //definitionint iy;                 //declaration and definitionextern in iz;           //declaration

5、标识符(identifier):用户自定义标识符不能出现连续两个下划线,不能出现下划线紧连大写字母,定义在函数体外的标识符不能以下划线开头

三、复合类型

1、引用:引用非对象,只是已经存在的对象的别名,定义引用时必须初始化,之后就与初始对象一直绑定在一起

注意:不能定义引用的引用

int ival = 1024;int &refval = ival;  //此后refval和ival等价,对任一操作等同于对另一个操作,而不是将ival值赋给refval

2、空指针:nullptr,使用nullptr或0替代c中的NULL,c++中void*不能隐式转换成其他指针类型(c中的NULL定义为(void *)0)

四、const限定符

1、默认情况下,const对象仅在文件内有效,若多个文件出现同名const,相当于每个文件内定义的独立变量,如果需要共享同名变量则像变量的声明与定义一样,在其他文件中使用extern

2、引用const对象时也要const,不能用非常量的引用去绑定常量对象

3、由于常量不变,因此对常量引用时可以初始化为任意能转换为引用类型的表达式即可

int i = 42;const int &r1 = i;   //此时不能通过修改r1来修改i,因为r1是const intconst int &r2 = 42;const int &r3 = r1 * 2;

4、指向常量的指针不能用于修改所指对象的值,想存放常量对象的地址也只能用指向常量的指针

const int i = 0;const int *p = &i;   //指向常量的指针,p指向常量i,这种情况下指针本身的值可以变,不是常量指针int const *pp = &i;  //常量指针,pp一直指向i

5、顶层const:任意对象如指针本身是常量;底层const:如指针、引用所指对象为常量(用于声明引用的均为底层const)

6、constexpr:变量声明为consexpr则一定是一个常量,必须由常量表达式初始化,常量表达式的值需要在编译时就得到初始化

//i和j都定义在全局(此时地址是固定的)int j = 0;                      //有固定地址的整型变量jconstexpr int i = 42;           //有固定地址的整型常量iconstexpr const int *p = &i;    //p是常量指针,指向常量iconstexpr int *p1 = &j;         //p1是常量指针,指向整型变量j

注意:constexpr表示编译期常量,而const并未区分是编译期常量还是运行期常量

// constexpr声明factorial可以参与编译期的运算,即编译期若能优化就直接优化,若不能则在运行过程中计算值constexpr int foo(int n){    return n + 1;}int main(){    std::array<int, foo(4)> val;       //编译时就计算出std::array<int, 5> val;    volatile int i = 8;                //volatile禁止编译器优化    std::cout << foo(i) << std::endl;  //使用i必须在运行时计算foo(i)}

五、处理类型

1、using:别名声明,注意在复合类型时,不能直接把别名带入复合类型判断,而要从意义上判断

typedef int wage;  //wage p等于int pusing wage = int;  //wage p等于int p

2、auto:auto定义的变量将由编译器自动分析变量类型,因此必须有初始值,且在一条auto语句中声明的多个变量的初始基本数据类型必须一致,当涉及引用时实际参与初始化的都是引用对象的值

注意:定义auto引用时会保留初始化的顶层const属性,非引用情况会忽略顶层const保留底层const属性

auto i = 0, *p = &i;        //正确auto sz = 0, pi = 3.1415;   //错误,类型不一致const int ci = 0;auto b1 = ci;               //int b1 = ci;auto &b2 = ci;              //const int &b2 = ci;

3、decltype:类型指示符,从表达式(不实际计算)的类型决定要定义的变量的类型但不初始化,decltype返回变量的类型包含顶层const和引用,与auto不同

注意:只有在decltype下,引用并不是引用对象的同义词

const int ci = 0, &cj = ci; decltype(ci) x = 0;            //x的类型是const int且初始化为0decltype(cj) y = x;            //y的类型是const int &且引用xdecltype(cj) z;                //错误,z是引用,必须初始化int i = 42, *p = &i, &r = i;decltype(r) b;                 //错误,r是引用此时返回引用,b是int &需要初始化decltype(r + 0) b;             //正确,r + 0之后就是具体的值而非引用,此时b是intdecltype(*p) b;                //错误,*p解引用则返回引用,b是int &需要初始化decltype(i) d                  //正确,d是未初始化的intdecltype((i)) d                //错误,对任何变量加上()就变为引用,d是int &需要初始化

注意:decltype((variable))的结果永远是引用,而decltype(variable)只有当variable本身是引用时结果才是引用
注意:赋值表达式是会产生引用的一类表达式,若i是int,则i=x的类型为int&

六、自定义数据结构

1、类内初始值:创建对象时,类内初始值将用于初始化数据成员,没有初始值的成员将被默认初始化(类内初始化不能使用四种初始化中的圆括号初始化)

2、为了确保各个文件中类的定义一致,类通常被定义在头文件中,且类所在头文件的名字应与类的名字一样

原创粉丝点击