ehsan_faal
شنبه 30 خرداد 1394, 01:08 صبح
سلام.
توی کد زیر توی تعریف سازنده دوم از یکی از داده های خصوصیه آرگومان ورودی استفاده میشه.
مگه توی تعریف یک کلاس فقط داده های خصوصیه مربوط به this رو نمیتونیم استفاده کنیم؟
نباید این آرگومان ورودی داده های خصوصیه خودش رو حفظ میکرد؟
#pragma once
#include <iostream>
using namespace std;
class Array
{
friend ostream &operator<<(ostream &, const Array &);
friend istream &operator>>(istream &, Array &);
public:
Array(int =10);
Array(const Array &);
~Array();
int getSize() const;
const Array &operator=(const Array &);
bool operator==(const Array &) const;
bool operator!=(const Array & right) const
{
return !(*this != right);
}
int &operator[](int);
const int &operator[](int) const;
static int getArrayCount();
private:
int size, *ptr;
static int arrayCount;
};
#include "Array.h"
#include <assert.h>
#include <iomanip>
using namespace std;
int Array::arrayCount = 0;
Array::Array(int arraySize)
{
size = (arraySize > 0 ? arraySize : 10);
ptr = new int[size];
assert(ptr != 0);
++arrayCount;
for (register int i = 0; i < size; i++)
ptr[i] = 0;
}
Array::Array(const Array &init) :size(init.size)
{
ptr = new int[size];
assert(ptr != 0);
++arrayCount;
for (register int i = 0; i < size; i++)
ptr[i] = init.ptr[i];
}
Array::~Array()
{
delete[] ptr;
arrayCount--;
}
int Array::getSize() const
{
return size;
}
const Array &Array::operator=(const Array &right)
{
if (&right!=this)
{
if (size!=right.size)
{
delete[] ptr;
size = right.size;
ptr = new int[size];
assert(ptr != 0);
}
for (register int i = 0; i < size; i++)
ptr[i] = right[i];
}
return *this;
}
bool Array::operator==(const Array &right)const
{
if (size!=right.size)
return false;
for (register int i = 0; i < size; i++)
if (ptr[i] != right[i])
return false;
return true;
}
int &Array::operator[](int index)
{
assert(0 <= index && index < size);
return ptr[index];
}
const int &Array::operator[](int index) const
{
assert(0 <= index && index < size);
return ptr[index];
}
int Array::getArrayCount()
{
return arrayCount;
}
istream &operator>>(istream & input, Array & Dest)
{
for (register int i = 0; i < Dest.size;i++) // friend can access to private member of Objects.
{
input >> Dest[i];
return input;
}
}
ostream &operator<<(ostream & output, const Array & Source)
{
register int i=0;
for (; i < Source.size;i++)
{
output << setw(12) << Source[i];
if ((i + 1) % 4 == 0)
{
output << endl;
}
if (i%4!=0)
{
output << endl;
}
}
return output;
}
#include <iostream>
#include "Array.h"
using namespace std;
void main()
{
Array a(8);
Array b(a);
}
ممنون میشم یه توضیحی بدید.
توی کد زیر توی تعریف سازنده دوم از یکی از داده های خصوصیه آرگومان ورودی استفاده میشه.
مگه توی تعریف یک کلاس فقط داده های خصوصیه مربوط به this رو نمیتونیم استفاده کنیم؟
نباید این آرگومان ورودی داده های خصوصیه خودش رو حفظ میکرد؟
#pragma once
#include <iostream>
using namespace std;
class Array
{
friend ostream &operator<<(ostream &, const Array &);
friend istream &operator>>(istream &, Array &);
public:
Array(int =10);
Array(const Array &);
~Array();
int getSize() const;
const Array &operator=(const Array &);
bool operator==(const Array &) const;
bool operator!=(const Array & right) const
{
return !(*this != right);
}
int &operator[](int);
const int &operator[](int) const;
static int getArrayCount();
private:
int size, *ptr;
static int arrayCount;
};
#include "Array.h"
#include <assert.h>
#include <iomanip>
using namespace std;
int Array::arrayCount = 0;
Array::Array(int arraySize)
{
size = (arraySize > 0 ? arraySize : 10);
ptr = new int[size];
assert(ptr != 0);
++arrayCount;
for (register int i = 0; i < size; i++)
ptr[i] = 0;
}
Array::Array(const Array &init) :size(init.size)
{
ptr = new int[size];
assert(ptr != 0);
++arrayCount;
for (register int i = 0; i < size; i++)
ptr[i] = init.ptr[i];
}
Array::~Array()
{
delete[] ptr;
arrayCount--;
}
int Array::getSize() const
{
return size;
}
const Array &Array::operator=(const Array &right)
{
if (&right!=this)
{
if (size!=right.size)
{
delete[] ptr;
size = right.size;
ptr = new int[size];
assert(ptr != 0);
}
for (register int i = 0; i < size; i++)
ptr[i] = right[i];
}
return *this;
}
bool Array::operator==(const Array &right)const
{
if (size!=right.size)
return false;
for (register int i = 0; i < size; i++)
if (ptr[i] != right[i])
return false;
return true;
}
int &Array::operator[](int index)
{
assert(0 <= index && index < size);
return ptr[index];
}
const int &Array::operator[](int index) const
{
assert(0 <= index && index < size);
return ptr[index];
}
int Array::getArrayCount()
{
return arrayCount;
}
istream &operator>>(istream & input, Array & Dest)
{
for (register int i = 0; i < Dest.size;i++) // friend can access to private member of Objects.
{
input >> Dest[i];
return input;
}
}
ostream &operator<<(ostream & output, const Array & Source)
{
register int i=0;
for (; i < Source.size;i++)
{
output << setw(12) << Source[i];
if ((i + 1) % 4 == 0)
{
output << endl;
}
if (i%4!=0)
{
output << endl;
}
}
return output;
}
#include <iostream>
#include "Array.h"
using namespace std;
void main()
{
Array a(8);
Array b(a);
}
ممنون میشم یه توضیحی بدید.