符号“&”和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(显思维)

执行函数时不改变类里的成员变量。

posted on 2013-01-31 19:12  健行~经纬  阅读(343)  评论(0编辑  收藏  举报