• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
指尖上的快乐
博客园    首页    新随笔    联系   管理    订阅  订阅

从一个小项目看return 引用 重载运算符

#ifndef _ARRAY_H_
#define _ARRAY_H_
  
class Array
{
private:
    int mLength;
    int* mSpace;
 
public:
    Array(int length);
    Array(const Array& obj);
    int length();
    void setData(int index, int value);
    int getData(int index);
    ~Array();
public:
    int& operator[](int i);
    Array& operator=(Array &a);
 
};
#endif




#include "iostream"
#include "Array.h"
using namespace std;
 
 
Array::Array(int length)
{
    if( length < 0 )
    {
        length = 0;
    }
     
    mLength = length;
    mSpace = new int[mLength];
}
 
Array::Array(const Array& obj)
{
    mLength = obj.mLength;
     
    mSpace = new int[mLength];
     
    for(int i=0; i<mLength; i++)
    {
        mSpace[i] = obj.mSpace[i];
    }
}
 
int Array::length()
{
    return mLength;
}
 
void Array::setData(int index, int value)
{
    mSpace[index] = value;
}
 
int Array::getData(int index)
{
    return mSpace[index];  //返回的只是一个值,没有内存地址,作不了左值,mSpace[index]本身是有内存地址的
} Array::~Array() { mLength = -1; delete[] mSpace; } int& Array::operator[](int i) { return mSpace[i]; //正常,因为mSpace[i]本身是有内存地址的,返回一个具有内存地址的数据是可以作引用的. return this->getData(i);//这里会提示"非常量的引用初始化必须为左值, 难道this->getData(i)作不了左值?" //解答:this->getDate(i)这个函数返回的只是一个值,this->getDate(i),只是返回65行函数的类型int,没有内存地址,可能存在于除了内存区外的任何地区,所以作不了引用. //这里要确保this->getDate(i)有内存地址,所以this->getDate(i)的返回必须是引用. } Array& Array::operator=(Array &a) { mLength = a.mLength; mSpace = new int[mLength]; for (int i = 0; i < mLength; i++) { mSpace[i] = a[i]; } return *this; }      

  函数,大概只有返回一个左值引用的才可以用作左值。其它基本全为右值。

posted @ 2016-02-07 11:24  指尖上的快乐  阅读(297)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3