SailorMoon-z

导航

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

posted on 2019-10-27 10:54  SailorMoon-z  阅读(490)  评论(0编辑  收藏  举报