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!

参考:https://www.cnblogs.com/qkqBeer/articles/10685572.html

猜你喜欢

转载自www.cnblogs.com/SailorMoon-z/p/11745813.html