指针 引用 const

一:引用
引用:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名; 定义的格式为:类型& 引用变量名=已定义过的变量名
引用的特点:
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;

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

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

当不希望函数内改变实参值,可以使用常引用形参(const int&a)
四:传值做返回值,传&做返回值
这里写图片描述
由于函数调用结束,销毁栈帧,当函数有返回值时,会将返回值拷贝给一个临时变量(系统会分配内存);即在一个函数的内部,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指向空地址,解引用空地址

猜你喜欢

转载自blog.csdn.net/sophia__yu/article/details/80622944