符号“&”和const在函数里不同位置的用法
其实引用的初衷是节省下空间,但是我们要注意引用是针对变量引入的。
1、在返回类型与函数名之间加“&”需要注意函数的返回值(能不加就最好不加)
(1)如果函数返回void则肯定可以用。
(2)如果函数返回一种既定类型的量则编译会有警告,因为函数调用完其被分配的栈空间就被释放了。
如 Team operator+(const Team & t) ; //2 用成员函数重载+运算符
函数体
Team Team::addtototal(const Team & t) { Team temp; temp.t_number = t_number + t.t_number; temp.t_totalscore = t_totalscore + t.t_totalscore; temp.averagescore(); return temp; } 加 & 号也可以运行,但会有如下警告: team.cpp: In member function ‘Team& Team::operator+(const Team&)’: team.cpp:73:7: warning: reference to local variable ‘temp’ returned 因为调用完,temp这个临时对象空间就被释放了,所以此处返回引用按理说时错误的。
友元重载同样会遇到上面情况:
friend Team operator+(const Team & t1,const Team & t2);//3 用友元函数重载+运算符
即temp的空间被释放掉了所以&temp没空间了
(3)若函数返回的事类中的默认this指针的值则会出现错误。
如Team operator>(const Team & t); //1 用成员函数重载>运算符
函数体
Team Team::operator>(const Team & t) { if(t.t_totalscore > t_totalscore) { return t; } else { return *this;//不用想太多,this就代表大的对象,由if的条件直接判断 } } 加 & 号不可运行,错误如下: team.cpp: In member function ‘Team& Team::operator>(const Team&)’: team.cpp:104:10: error: invalid initialization of reference of type ‘Team&’ from expression of type ‘const Team’
友元重载同样会遇到上面情况:
friend Team operator>(const Team & t1, const Team & t2); //2 用友元函数重载>运算符
即该对象用完到下一个对象时this就会立马改变了,所以返回会出错。
2、在函数参数的类型与变量间加&需要注意参数的类型(看实参是什么)
(1)若后面调用函数时给的实参是一个变量则编译不会出错。
Team::Team(int & t) { t_totalscore = t;
}
正确调用:
int m = 87; Team tm3(m);
Team::Team(int const t) { t_totalscore = t; }
正确调用
Team tm3(87);
(2)若后面调用函数是实参是整型常量、字符型常量则编译会出错,因为引用是变量的别名。
const的初衷是定义一些其内部值不可改变的数据,const用法只需明白其功能类比&即可得到
1、在函数返回类型之前的const
函数返回的值不可改变,即后面不能拿其返回值当变量用。
2、在形参类型之前的const(实参常数赋值后就不希望它改变)
函数的实参不能为变量。
Team::Team(int const t)
{
t_totalscore = t;
}
正确调用
Team tm3(87);
为变量时不能定义为const。
Team::Team(int & t)
{
t_totalscore = t;
}
正确调用:
int m = 87;
Team tm3(m);
3、类中在函数最后加的const(显思维)
执行函数时不改变类里的成员变量。