c++笔记——&引用作为返回值
&引用
一,&引用
-
1,参数引用,即取别名,和实参一样的内存。常引用,为了保护数据安全。
-
2,作为函数返回值
使用方法:
类型标识符 &函数名(形参列表及类型说明)
{函数体}
优势:用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。
例子:
class Point { //定义Point类,实现前++,后++ (成员函数重载)
public:
Point(int found = 0) :found(found) {}; //初始化found值
Point &operator++();
Point &operator++(int);
void present();
private:
int found;
};
//逻辑分离,实现函数
Point& Point::operator++() { //将返回一个应用
found++;
return (*this);
};
Point &Point::operator++(int) {
Point old = *this;
++(*this);
return old;
};
void Point::present() {
cout << "found = " << found <<endl;
}
int main() {
Point p(1);
(p++).present();
(++p).present();
return 0;
}
结果:
并没有达到我们想要的效果,p++呈现的是随机数字。因为不能返回局部变量的引用
即
Point &Point::operator++(int) {
Point old = *this; //old是局部变量,出该函数会被销毁。因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。
++(*this);
return old;
};
除去Point::operator++(int)的& 返回副本,结果:
总结:
!!!引用作为返回值,必须遵守以下规则:
1.不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。
2.不能返回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。
3.可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常 量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。
二,虚函数 纯虚函数 虚基类三者区别
概念区分:
-
1.虚函数是用于多态中virtual修饰父类函数,确保父类指针调用子类对象时,运行子类函数的。只有通过基类指针或引用调用虚函数时起作用
-
2.纯虚函数是用来定义接口的,也就是基类中定义一个纯虚函数,基类不用实现,让子类来实现。呈现多态
-
3.虚基类是用来在多继承中,如果父类继承自同一个父类,就只实例化一个父类。消除二义性,少冗余节省内存。
另:在虚基类的派生类构造函数中,先执行虚基类的构造函数。
如有错误,请指正,thanks!
posted on 2019-10-27 10:54 SailorMoon-z 阅读(329) 评论(0) 编辑 收藏 举报