引入
在C++基础语法:引用&的补充-优快云博客提到了引用类型在函数外是变量,在函数内部是指针.其中赋值细节部分,以及类中使用对象引用和对象的差别,返回引用和返回常量做一个理解
引用回顾
1.声明引用等于取变量地址;
引用赋值变量,相当于把引用指向地址的值赋值给变量
虽然他仍然是"指针",但用起来是看不出来的,所以被当成变量.
int main(void) {
int a = 10;
int& a_ref = a; //声明引用
int c = a_ref; //引用赋值变量
cout << c << endl;
}
2.将变量传入引用做形参的函数,可以改变原值,起到指针的作用
void plus2(int& a);
int main(void) {
int a = 10;
plus2(a); //改变传入值a
cout << a << endl; //原值已改变
}
void plus2(int& a) { //传入值加2
a += 2;
}
返回引用的条件
前面说到的"返回引用必须是传入的引用",准确的描述应该是"返回引用必须是已存在的数据",原理和指针是一样的.在类里面声明的数据,也可以返回其引用.例如:
class Any {
double money;
double& fun() {
return money;
}
};
这里并没有给fun()传入引用,对于fun()来说,money是本来已存在的数据,所以可以返回其引用.
返回引用和返回变量
返回引用相当于返回指针,例如:
#include<iostream>
using namespace std;
class Person {
int age;
public:
Person(int ag):age(ag){}
int getAge() { return age; }
void setAge(int ag) { age = ag; }
};
class Cont {
// Person& person; //引用对象做属性
Person person; //对象做属性,二选一使用
public:
Cont(Person& per):person(per){} //构造函数返回引用和返回对象(变量)
void change(int age) { person.setAge(age); }
Person getPerson() { return person; };
};
说明:在构造函数中,传入Person对象,如果返回引用类型Person&,则后面的change影响原对象属性值;如果返回Person类型,则不能影响到原对象属性值.测试代码:
int main(void) {
Person zs(20); //生成对象张三
Cont cont(zs); //生成包含张三的对象
cont.change(40); //cont中改变年龄
//引用做属性影响张三的年龄,对象做属性不影响
cout << "张三的年龄是:" << zs.getAge() << endl;
Person lisi = cont.getPerson(); //生成李四对象
cout << "李四的年龄是:" << lisi.getAge() << endl;
}
因为返回引用相当于返回指向zs的指针,而返回对象相当于生成了一个Person类型的新对象,这就是返回引用和返回变量的不同.
小结
引用在类中的用法.整体来看,引用还是作为"指针"比较容易理解.