// 函数返回引用.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
struct Point
{
int x, y;
};
class Test
{
private:
Point pt;
public:
Test()
{
pt.x = 10;
pt.y = 20;
}
Point &GetPt() { return pt; } //返回引用,就可以在外面对pt进行修改了
};
void Fun(Test &t1)
{
Point &pt = t1.GetPt(); //如果函数不是返回的引用,那么下面的代码就是改变的临时对象的值
//对类中的pt并没有改变
pt.x = 20;
pt.y = 30;
}
void Print(Test &t1)
{
Point pt = t1.GetPt();
cout << pt.x << endl;
cout << pt.y << endl;
}
int main()
{
Test t1;
Print(t1); //打印通过构造函数初始化的pt成员,值位10,20,没问题
Fun(t1); //形参t1为引用,所以在函数中的操作就相当于是直接操作的t1实参,按说应该t1对象中
//的成员属性pt应该是被改变了的,但是结果很意外,还是原来的值,那是为什么呢
//原因就出在成员函数GetPt()虽然返回的是成员属性pt,但是实际上在Fun函数中pt并没有接收
//到真正的类成员属性pt,而是接收的函数返回的一个pt对象的拷贝本,所以在Fun(0函数中
//改变的并不是类中成员属性pt,而是一个pt的拷贝本,所以并没有达到在Fun()函数中改变
//类成员属性pt的值,如果要通过GetPt成员函数得到类中的私有成员pt,必要让函数返回引用
//这样就不会产生返回值的拷贝本了,而是返回的值本身了,就可以在Fun()函数中对类中的私有
//成员pt进行真正的修改了
Print(t1);
system("pause");
return 0;
}
//另外要说一下的是:拷贝构造函数调用都有哪几种情况?
//答:第一种函数的形参作为类对象的情况
// 第二种将函数的返回值类型为类类型的情况,因为函数的返回值会产生一个拷贝本,所以在这种情况下
// 需要将函数的返回值类型写成引用
// 另外将一个对象赋值给另一个已经定义好的对象的是通过调用赋值运算符重载进行拷贝的
//然后需要在说一下的是为什么对类对象的"="赋值运算符进行重载,必要要返回引用呢?
//原因也是因为函数返回值会返回产生的拷贝本,所以如果不是返回的引用,那么返回的就是一个形参,是一个
//临时对象,那么在函数执行完之后就被释放了
//String& String::operator =(const String &str) //注意与“+”比较,函数为什么要用引用呢?a=b=c可以做为左值
//{
// if (this == &str)
// {
// return *this;
// }
// delete[] m_string;
// int len = strlen(str.m_string);
// m_string = new char[len + 1];
// strcpy(m_string, str.m_string);
// return *this;
//}
//String String::operator +(const String &str)
//{
// String newstring;
// if (!str.m_string)
// {
// newstring = *this;
// }
// else if (!m_string)
// {
// newstring = str;
// }
// else
// {
// int len = strlen(m_string) + strlen(str.m_string);
// newstring.m_string = new char[len + 1];
// strcpy(newstring.m_string, m_string);
// strcat(newstring.m_string, str.m_string);
// }
// return newstring;
//}
函数返回值与函数返回引用
最新推荐文章于 2023-02-19 19:04:23 发布