欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

指针 引用 const

程序员文章站 2024-01-01 16:09:16
...

一:引用
引用:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名; 定义的格式为:类型& 引用变量名=已定义过的变量名
引用的特点:
1.一个变量可以有多个别名

int a = 1;
int& b = a;
int& c = a;
int& d = b;
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &c << endl;
b = 4;

引用变量地址相同:
指针 引用 const
一个引用变量改变,其余变量都改变:
指针 引用 const
2.引用必须初始化
int a = 2;
int& c; //错误
3.引用只能在初始化时被引用一个,不能改变为再引用其他的变量
int a = 2;
int b = 3;
int& c = a; //c是a的引用
c = b; //是赋值,将b赋给a
二:const引用
首先,了解const指针:
指针 引用 const
指针 引用 const
引用赋值用指针赋值一样,只能缩小,即大范围类型赋给同等类型或者小范围类型。
指针 引用 const
三:引用作为参数
在函数传参时,是将实参拷贝给形参:
如果形参是非引用的传值方式,则生成局部临时变量接受实参的值;
如果形参是引用的传值方式,则形参是实参的别名,即形参实参指向同一段空间,即不会拷贝;
如果实参是对象,且不用引用作为参数,会有一次拷贝构造。

void swap(int& a, int& b)
    {
        int tmp = a;
        a = b;
        b = tmp;
    }

当不希望函数内改变实参值,可以使用常引用形参(const int&a)
四:传值做返回值,传&做返回值
指针 引用 const
由于函数调用结束,销毁栈帧,当函数有返回值时,会将返回值拷贝给一个临时变量(系统会分配内存);即在一个函数的内部,return的时候返回的都是一个拷贝,不管是变量、对象还是指针都是返回拷贝,但是这个拷贝是浅拷贝。

int& Add(int a, int b)//用引用返回
{
    int ret = a + b;
    return ret;
}
int &c = Add(1, 2);//c是Add函数返回值引用,即两者共用一段空间
Add(3, 4);
cout << c << endl;//7,所以对于临时变量不要用&返回

引用返回时,当ret再次改变,解引用值也会改变。
结论:
1.不要返回一个临时变量的引用。
2.如果返回对象出了当前作用域依旧存在,则最好使用引用返回,可以减少一次拷贝构造,更高效。
引用和指针的区别和联系:
1.引用只能在定义时初始化一次,之后不能改变引用其他变量;而指针指向的值可变
2.引用必须指向有效的变量,指针可以为空
3.sizeof指针对象和引用对象的意义不同。sizeof引用得到的是所指向变量的大小,而sizeof指针是对象地址的大小
char a = 10;
char *p = &a;
cout << sizeof(p) << endl; //32位是4,64位是8
char& b = a;
cout << sizeof(b) << endl; //1
4.指针和引用++(–)意义不同,指针++是+所指类型大小,引用++就是+1
5.相对而言,引用比指针安全。因为指针需要判空,指针所指地址释放后要置null,否则可能存在野指针问题。
请看下列代码:

int* p = 0;
int b = 3;//有空地址
int& a = *p;
swap(a, b);//在这里崩溃,因为a指向空地址,解引用空地址
相关标签: 引用

上一篇:

下一篇: