• C++中的一些定义


    PS: 这篇博客用来记录一些一般的C++书中草草掠过的一些概念。 或者一些不太容易理解的概念的详细解释。 欢迎新手进入,欢迎高手指正! Orz 。

    引用: 为对象起了另外一个名字, 引用类型引用(refers to)另外一种类型。

    int ival = 1024;

    int &refval  = ival;

    int &i//报错。

    一般在初始变量时,初始值会被拷贝到新建的对象中。 然而定义引用时,程序把引用和它的初始值绑定(很类似与指针)在一起,而不是把初始值拷贝给引用。一旦初始化完成,引用将和它的初始值绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化!

    引用本身不是对象, 而只是为一个已经存在的对象所起的另一个名字。 因为引用本身不是对象, 所以不能定义引用的引用。

    指针与引用的区别: 《1》 引用本身不是一个对象。而指针本身就是一个对象, 所以可以有指向指针的指针,允许对指针的赋值和拷贝,而且在指针的生存周期内它可以指向几个不同的对象。        《2》 指针无需在定义时赋值(但是,尽量要定义后立即赋值, 不然如果,忘赋值了会有很大的隐患!), 和其他内置类型一样,在块作用域内定义的指针如果没被初始化,也将拥有一个不确定的值。 

    数组名与指针:

         在大多数情况下, 数组名被解释成其第一个元素的地址, 然而也有例外。 《1》 数组声明使用数组名来标记存储位置; 《2》 对数组名使用sizeof将得到整个数组的长度(以字节为单位); 《3》 将运算符&用于数组名时, 将返回整个数组的地址。 也即是: 定义数组时,申请的内存块的地址。

    两个转化公式:  arr[i] = *(arr+i) // values in two notations

                          &arr[i] == arr + i // addresses in two notations

    数组在函数中传递:

        当数组是一维数组的时候我们很好理解, 因为数组名被解释成其第一个元素的地址, 形参中只要有一个指针变量(或数组名)来接受就行啦。 然而当数组名是二维数组时怎么办呢? 它既有行,又有列。

    int data[3][4] = {{1, 2, 3, 4}, {9, 8, 7, 6}, {2, 4, 6, 8}};
    int total = sum(data, 3);

    data是一个数组名, 该数组有三个元素,其中每一个元素都是数组, 由4个int值组成。 因此data 的类型是指向有4个int组成的数组的指针, 因此正确的原型如下:

    int sum(int (*ar2)[4], int size); // (*ar2)[4]是一个指向由4个int组成的指针
    int *ar2[4];                      //  4个指向int的指针组成的数组。注意与上面区分!

    临时变量, 引用参数和const

    如果实参与引用参数不匹配, C++将生成临时变量。 当前, 仅当参数是const 引用时, c++才允许这么做 ,但是以前不是这样的。

    如果引用参数是const, 则编译器将在下面两种情况下生成临时变量:

    《1》 实参的类型正确,但不是左值

    《2》实参的类型不正确, 但是可以转化成正确的类型。

    左值是可以被引用的数据对象, 如: 变量, 数组元素, 结构成员, 引用和解除引用的指针都是左值。 非左值包括字面常量(用引号括起的字符串除外,它们由地址表示!)和包含多项式的表达式。 在C语言中最初的左值指的是可以出现在赋值语句左边的实体。 但是这是在const关键字引入之前的事, 现在常规变量和const变量都可以作为左值(但是const变量并不能被修改!)

    #include <iostream>
    using namespace std;
    
    double refcube(const double &ra)
    {
        return ra*ra*ra;
    }
    
    int main()
    {
        double side = 3.0;
        double *pd = &side;
        double &rd = side;
        long edge = 5L;
        double lens[4] = {2.0, 5.0, 10.0, 12.0};
        double c1 = refcube(side); // ra is side
        double c2 = refcube(lens[2])// ra is lens[2]
        double c3 = refcube(rd) // ra is rd is side
        double c4 = refcube(*pd)// ra is *pd is side
        double c5 = refcube(edge); // ra is temporary variable
        double c6 = refcube(7.0); // ra is temporary variable
        double c7 = refcube(side + 10.0); // ra is temporary variable
        return 0;
    }

     确切的说, 上面说的是左值引用, C++11新增了一种新的引用-----右值引用。 关于这个问题以后再说!

  • 相关阅读:
    把安卓QQ浏览器下载的视频m3u8列表文件转成mp4格式(或者其它视频格式)
    Win8系统删除历史用户本地头像
    大叔郑州街头卖刀 这口才应该上春晚啊
    从尽力而为到全力以赴
    用虚假邮箱注册微博
    百度网盘总结
    试用Sublime Text 3
    玉米地烧毁,相关部门让找鸟儿去索赔
    Video Download Helper总结
    9.29
  • 原文地址:https://www.cnblogs.com/acm1314/p/4767917.html
Copyright © 2020-2023  润新知