刚接触运算符重载时遇到的小问题

时间:2021-11-07 14:17:39


如下的程序编译时有警告,
(93) : warning C4620: no postfix form of 'operator ++' found for type 'Array', using prefix form
(4) : see declaration of 'Array'
请问是为什么?
还有那个拷贝函数里为什么分配的内存为size+1?

#include <iostream.h>

class Array
{
public:
Array(int = 10);
Array(const Array &);
~Array();
void Print();
int Getsize();
void operator ++();
Array &operator +=(Array &);
private:
int *ptr;
int size;
};

Array::Array(int arraysize)
{
size = arraysize;
ptr = new int[size];
for (int j = 0; j < size; j++)
{
ptr[j] = j;
}
}

Array::Array(const Array &init)
{
size = init.size;
ptr = new int[size + 1];/*这里的ptr为什么要size+1?我试过不+1也没问题啊?*/
for (int j = 0; j < size; j++)
{
ptr[j] = init.ptr[j];
}
}

Array::~Array()
{
delete [] ptr;
}

int Array::Getsize()
{
return size;
}

void Array::Print()
{
for (int j = 0; j < size; j++)
{
cout << ptr[j] << " ";
}
}

void Array::operator ++()
{
for (int j = 0; j < size; j++)
{
ptr[j]++;
}
}

Array &Array::operator +=(Array &v)
{
int temp;
if (v.size > size)
{
temp = size;
}
else
{
temp = v.size;
}
for (int j = 0; j < temp; j++)
{
ptr[j] = ptr[j] + v.ptr[j];
}
return *this;
}

void main()
{
Array a(10), b(10);

a.Print();
cout<< endl;
b.Print();

cout<< endl;

a += b;
b++;

a.Print();

cout << endl;

b.Print();

cout << endl;

Array c(b);
c.Print();
cout<< endl;
}

6 个解决方案

#1


size + 1 是为了最后一个 '\0'用的

#2


那个警告指的是你operator++()需要一个哑元,
要么你把 b++,改成 ++b

#3


将b++;
改为++b

#4


将b++改为
++b

#5


哦,一刷新就发了两次了:)
或者
void operator ++(int);

#6


自增和自减
    重载的++和--号运算符出现了两难选择的局面,这是因为希望根据它们出现在它们作用的对象前面(前缀)还是后面(后缀)来调用不同的函数。解决是很简单的,但一些人在开始时却发现它们容易令人混淆。例如当编译器看到++a(先自增)时,它就调用operator++(a);但当编译器看到a++时,它就调用operator++(a,int)。即编译器通过调用不同的函数区别这两种形式。在UNARY.CPP成员函数版中,如果编译器看到++b,它就产生一个对B::operator++()的调用;如果编译器看到b++,它就产生一个对B::operator++(int)的调用。
    除非对于前缀和后缀版本用不同的函数调用,否则用户永远看不到它动作的结果。然而,实质上两个函数调用有不同的署名,所以它们和两个不同的函数体相连。编译器为int参数(因为这个值永远不被使用,所以它永远不会被赋给一个标识符)传递一个哑元常量值用来为后缀版产生不同的署名。

#1


size + 1 是为了最后一个 '\0'用的

#2


那个警告指的是你operator++()需要一个哑元,
要么你把 b++,改成 ++b

#3


将b++;
改为++b

#4


将b++改为
++b

#5


哦,一刷新就发了两次了:)
或者
void operator ++(int);

#6


自增和自减
    重载的++和--号运算符出现了两难选择的局面,这是因为希望根据它们出现在它们作用的对象前面(前缀)还是后面(后缀)来调用不同的函数。解决是很简单的,但一些人在开始时却发现它们容易令人混淆。例如当编译器看到++a(先自增)时,它就调用operator++(a);但当编译器看到a++时,它就调用operator++(a,int)。即编译器通过调用不同的函数区别这两种形式。在UNARY.CPP成员函数版中,如果编译器看到++b,它就产生一个对B::operator++()的调用;如果编译器看到b++,它就产生一个对B::operator++(int)的调用。
    除非对于前缀和后缀版本用不同的函数调用,否则用户永远看不到它动作的结果。然而,实质上两个函数调用有不同的署名,所以它们和两个不同的函数体相连。编译器为int参数(因为这个值永远不被使用,所以它永远不会被赋给一个标识符)传递一个哑元常量值用来为后缀版产生不同的署名。