C++:变量

作者: 刘尐六 | 来源:发表于2017-11-20 22:05 被阅读0次

    c++的标识符由字母、数字、下划线组成,必须以字母或者下划线开头。对长度没有限制,大小写敏感。不能使用关键字,不能连续出现两个下划线,不能以下划线紧连大写字母开头,函数体外的标识符不能以下划线开头(其实编译能通过)。

    初始化

    下面四种方式都可以对变量进行初始化:

    int a = 0;
    int a = {0};
    int a{0}; //列表初始化
    int a(0);
    

    对于列表初始化方式,C++ 11支持,要增加编译选项-std=c++0x.另外,定义于任何函数体之外的内置类型变量,如果没有初始化,则使用默认初始化值,而定义在函数体内的内置类型变量,则不会被默认初始化,是一个未初始化的值。建议初始化每个内置类型的变量.

    定义和声明

    这个概念对C++的分离式编译机制非常重要。变量只能被定义一次,但可以多次声明。声明确定变量的名字和类型,使名字为程序所知,而定义创建与名字关联的实体,会分配存储空间。

    extern int i; //声明
    int i; //定义
    extern int i = 0; //定义,初始化了的声明成为定义
    

    复合类型

    引用:引用就是别名,三点要求,一是引用的类型要与绑定的对象严格匹配;二是引用只能绑定在对象(变量)上,不能绑定在字面值常量或表达式的计算结果上;三是引用必须初始化,且初始化后不能再绑定到其他对象上。

    指针:指针也是一个对象,也要求类型匹配。生命周期内可以先后指向几个不同的对象,而且不必在定义时赋初值。下面是几种定义空指针的方法:

    int *p1 = nullptr; //C++ 11,推荐
    int *p2 = 0; 
    int *p3 = NULL; //等价于int *p3 = 0;避免这种用法
    

    另外,void* 指令可以存放任意对象的地址。

    const限定符

    const对象必须被初始化,初始值可以是任意类型。默认情况下,const对象仅在文件内有效。这是因为编译时要获取const对象的初始值,就必须有对该const对象的定义,然而一个变量又只能定义一次,为了支持这种做法,使const对象仅在文件内有效,也就是说,如果多个文件中出现了同名的const对象,则等同于在不同的文件中分别定义了独立的变量。

    为了使多个文件共享const对象(只在一个文件中定义const对象,其他文件中声明并使用它),可行的做法是,对于const对象,不管是声明还是定义都添加extern关键字。

    //file1.cpp,定义并初始化一个常量,该常量能被其他文件访问
    extern const int bufSize = fn();
    //file1.h,指明该对象不是当前文件独有
    extern const int bufSize;
    

    对const的引用

    对常量的引用(常量引用)不能被用来修改它所绑定的对象。

    const int ci = 1024;
    const int &r1 = ci;//正确,引用及其对应的对象都是常量
    r1 = 42; //错误,r1是对常量的引用
    int &r2 = ci;//错误,试图让一个非常量引用指向一个常量对象
    

    初始化常量引用时允许用任意表达式作为初始值,只要改表达式的结果可以转换为引用的类型即可。允许为一个常量引用绑定非常量的对象、字面值或者表达式。

    int i = 42;
    const int &r1 = i;//正确,此时不允许通过r1改变i的值
    const int &r2 = 42; //正确
    const int &r3 = r1*2;//正确
    int &r4 = r1*2;//错误
    

    当一个常量引用被绑定到另外一种类型上时:

    double dval = 3.14;
    const int &r1 = dval;
    

    实际上会创建一个临时变量,然后将常量引用绑定在该临时变量上:

    const int temp = dval;
    const int &r1 = temp;
    

    当r1不是常量引用时,允许对r1进行赋值,此时r1绑定在一个临时量上,那么这种赋值也就没有意义了,所以C++规定这种做法是非法的。

    指向常量的指针

    指向常量的指针不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针。而且,指向常量的指针可以指向一个非常量对象。

    const double pi = 3.14;
    double *ptr = π//错误,ptr是一个普通指针
    const double *cptr = π//正确
    *cptr = 42;//错误,不能修改*cptr的值
    

    常量指针(const指针)

    常量指针,即指针本身为常量,必须被初始化,且初始化后不再改变。不变的是指针本身的值而不是指针指向的值。

    int errNumb= 0;
    int *const curErr = &errNumb;//curErr将一直指向errNumb
    const double pi = 3.14;
    const double *const pip = π//pip为指向常量对象的常量指针
    

    顶层const

    顶层const指的是本身不可以被改变。底层const指的是自身所指对象不可以被改变。用于声明引用的const都是底层const。顶层const的拷贝不受限制,但是底层const的拷贝的对象必须具有相同的底层const资格。一般来说:非常量可以赋值给常量,反之则不行

    相关文章

      网友评论

        本文标题:C++:变量

        本文链接:https://www.haomeiwen.com/subject/tvvbvxtx.html