关于C++函数思考2(函数返回引用和返回非引用的区别)

引用是提高代码效率的一大利器,尤其对于对象来说,当引用作为参数时候不用大面积的复制对象本身所造成的空间与时间的浪费。所以有时候对于参数的返回值我们也希望返回参数的引用。在这里我们回忆一下C语言函数返回局部变量所注意的方面,也可以看我的这篇文章。下来我们对于C++
中函数返回引用或非引用进行探讨!!

1.返回引用

/**********************************************************************
* *   Copyright (c)2015,WK Studios
* *   Filename:  A.h
* *   Compiler: GCC  vc 6.0
* *   Author:WK
* *   Time: 2015 4 5
* **********************************************************************/
#include<iostream>

using std::cout;
using std::cin;
class Test
{
public:
	Test(int d=0):m_data(d)
	{
		cout<<"Create Test Obj :"<<this<<"\n";
	}
	Test(const Test &t)
	{
		cout<<"Copy Test Obj : "<<this<<"\n";
		m_data = t.m_data;
	}
	Test& operator=(const Test &t)
	{
		cout<<"Assgin:"<<this<<" : "<<&t<<"\n";
		if(this != &t)
		{
			m_data = t.m_data;
		}
		return *this;
	}
	~Test()
	{
		cout<<"Free Test Obj :"<<this<<"\n";
	}
	int GetData()const
	{
		return m_data;
	}
	void print()
	{
		cout<<m_data<<"\n";
	}
private:
	int m_data;
};
//方式一
Test& fun(const Test &t)
{
	int value = t.GetData();
	Test tmp(value);
	return tmp;
}

void main()
{
	Test t(10);

	Test t1;
	t1 = fun(t);
	cout<<"m_data of t1 is: ";
	t1.print();

	Test t2 = fun(t);
	cout<<"m_data of t2 is: ";
	t2.print();
}

2.返回非引用

<span style="color:#333333;">/**********************************************************************
* *   Copyright (c)2015,WK Studios
* *   Filename:  A.h
* *   Compiler: GCC  vc 6.0
* *   Author:WK
* *   Time: 2015 4 5
* **********************************************************************/
#include<iostream>

using std::cout;
using std::cin;
class Test
{
public:
	Test(int d=0):m_data(d)
	{
		cout<<"Create Test Obj :"<<this<<"\n";
	}
	Test(const Test &t)
	{
		cout<<"Copy Test Obj : "<<this<<"\n";
		m_data = t.m_data;
	}
	Test& operator=(const Test &t)
	{
		cout<<"Assgin:"<<this<<" : "<<&t<<"\n";
		if(this != &t)
		{
			m_data = t.m_data;
		}
		return *this;
	}
	~Test()
	{
		cout<<"Free Test Obj :"<<this<<"\n";
	}
	int GetData()const
	{
		return m_data;
	}
	void print()
	{
		cout<<m_data<<"\n";
	}
private:
	int m_data;
};
//方式一
Test fun(const Test &t)
{
	int value = t.GetData();
	Test tmp(value);
	return tmp;
}

void main()
{
	Test t(10);

	Test t1;
	t1 = fun(t);
	cout<<"m_data of t1 is: ";
	t1.print();

	Test t2 = fun(t);
	cout<<"m_data of t2 is: ";
	t2.print();

}
</span>

下来总结一下返回引用和非引用:

时间: 2024-10-12 10:56:28

关于C++函数思考2(函数返回引用和返回非引用的区别)的相关文章

引用类型变量和非引用类型变量的区别

#include<stdio.h> void fa(int a){ a++; printf("在函数a中,a = %d\n", a); } void fb(int &a){ a++; printf("在函数a中,a = %d\n", a); } void main(){ int n = 1; printf("在主程中,调用函数fa之前:n = %d\n", n); fa(n); printf("在主程中,调用函数fa

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):当函数返回一个局部对象时,虽然这个对象已经释放,但是返回时会产生一个临时的对象.而当返回一个局部对象的引用时,这个对象已经不存在了.这就要求在函数参数中,包含一个引用或指针.int &func(int a,int b,int &retsult){ retsult = a + b; return &retsult}但是如下代码是错误的(返回局部对象的引用)int &func(int a,int b){ int &

C++函数返回引用、非引用以及临时变量的问题

C++中新增了引用类型,所以函数的返回值可以是引用类型.那么就会有人想问 返回引用类型与返回非引用类型有区别吗? 结论是显然的,而且有明显的区别.尤其初学者会很容易绕进去.让我们先看四个函数原型.以int类型来举例 (1) int fun(...) { return ....//后面跟的是一个引用 } 例如:int fun(int &a) { return a; } (2)int fun(...) { return....//后面跟的是一个非引用 } 例如:int  fun(int a) { r

基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------&gt; 可以返回派生类对象的引用或指针

您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. 百度和网页 http://bbs.csdn.net/topics/380238133 的作者无关,不对其内容负责.百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面. 首页 精选版块 移动开发 iOS Android Qt WP 云计算 IaaS Pass/SaaS 分布式计算/Hadoop J

为什么赋值操作符函数的参数为const引用,返回值为引用

为什么赋值操作符函数的参数为const引用,返回值为引用 1.返回值类型 返回类型一般声明为类型的引用,并在函数结尾时返回实例自身的引用(即*this).这里主要有两个原因:(1)返回引用可以减少一次拷贝构造和析构函数导致不必要的开销,因为返回值类型不是引用,会创建一个匿名对象,这个匿名对象时个右值,获取return的值.(2)可以实现连续赋值 在例子中 b=c=a; 返回值不是引用类型也是可以的,其运算顺序 b=(c=a); c得到一个右值,再将右值赋给b,所以逻辑上没有问题的.但是如果是 (

C++基础知识(八)---函数返回值(返回值,返回指针,返回对象,返回引用)---引用---复制构造函数(拷贝构造函数)

一.函数返回值 1.返回值: int test () { int a=1; return a; } 返回值时最简单的方式,它的操作主要在栈上,变量a在函数结束后会删除,为了返回a的值,系统会在内部建立一个临时变量保存a的值,以返回给调用该函数的表达式,调用结束后变量便不再存在.如果a是简单地数据类型也无所谓,不是很占用内存,如果a是大的自定义类型的数据,那么对a的复制将会占用比较大的内存.函数返回值是右值,不能进行运算符操作. 2.返回指针: int *test2() { int *b=new

为什么类的拷贝构造参数加引用、重载赋值函数的返回值和参数加引用

class string { public: string(const char *str=NULL); string(const string& str);     //copy构造函数的参数为什么是引用呢? string& operator=(const string & str); //赋值函数为什么返回值是引用呢?参数为什么是引用呢? ~string(); }; 下面我就给大家解释一下: class String1 { public: String1(const char*

c++中函数参数传递(值传递、指针传递,引用传递)进一步认识

概念 首先从概念上来说一下这几种函数传参方式及区别: 1.值传递:形参是实参的拷贝,改变函数形参的值并不会影响外部实参的值,这是最常用的一种传参方法,也是最简单的一种传参方法,只需要传递参数,返回值那是return考虑的: 2.指针传递:指针传递参数从本质上来说也是值传递,它传递的是一个地址.[值传递过程中,被调函数的形参作为被调函数的局部变量来处理,即在函数内的栈中开辟内存空间以存放由主调函数放进来的实参的值,从而成了实参的一个副本(记住这个,函数内参数的是实参的副本)].由于指针传递的是外部

函数何时值传递,何时指针,何时引用传递总结

编程中定义函数,一般三种传递方法,看是简单.想灵活合理选择,还须要大量的编程经验和技巧. 故在这里特意总结一下这三种传递的方法. 根本差别: 函数值传递不改变变量值,假设想改变变量值,须要返回值,然后用变量接收一下这个返回值. 而指针传递和引用传递都能够在函数内改变变量值.不须要通过返回值的形式改变. 应用场合: 当想通过这个函数.改变好几个变量的值,多个变量都通过函数返回值来改变变量值方式费时费力.所以这样的场合就比較适合使用指针和引用. 指针传递须要开内存.假设忘记释放的话,可能导致内存泄露