C++学習ノート(19)コピーオペレータ関数stackクラスの定義
2061 ワード
学習のポイント:
1このstackクラスの定義と使用を学習します.
2コピーオペレータ関数=、およびいつコピーオペレータ関数を書き換える必要があるか.
3 stringオブジェクトの文字列がスタックに格納されているためmemcpyでstring配列をコピーすることはできないことを覚えておいてください.memcpyは浅いコピーを引き起こし、複数回の解放の問題を引き起こす可能性があります.
1このstackクラスの定義と使用を学習します.
2コピーオペレータ関数=、およびいつコピーオペレータ関数を書き換える必要があるか.
3 stringオブジェクトの文字列がスタックに格納されているためmemcpyでstring配列をコピーすることはできないことを覚えておいてください.memcpyは浅いコピーを引き起こし、複数回の解放の問題を引き起こす可能性があります.
#include <iostream>
using namespace std;
typedef string T;
typedef unsigned int unit;
class Stack
{
T *mem;//string new
unit max;
unit len;
public:
Stack(unit n):mem(new T[n]), max(n), len(0) {}
// max
Stack(Stack &s):max(s.max),len(0),mem(new T[s.max])
{
}
~Stack(){delete[] mem;}
unit max_size() const {return max;}
unit size() const{return len;}
Stack& push(const T& e)
{
if(len >= max) throw 1;
else mem[len++] = e;
return *this;
}
T pop(T& e)
{
if(len ==0 ) throw 0;
return mem[--len];
}
void print() const
{
for(int i = 0; i< len; i++)
{
cout << mem[i] << "|";
}
cout << endl;
}
//
Stack& operator=(const Stack& s)
{
if(this == &s) return *this; //
delete[] mem; //
string *temp = new T[s.max];
len = s.len;
for(int i =0; i< len;i++)
{
mem[i] = s.mem[i];
}
return *this;
}
};
int main()
{
Stack s1(5);
//s1.push(1);
// push() Stack 。
s1.push("hello").push("good morning").push(" ");
s1.print();
// Stack s2(s1); : ( )
// mem
Stack s2(s1);
s2.print();
s2.push(" ").push(" ");
s2.print();
//
//
s1 = s2;
cout << "s1 = s2 print" <<endl;
s1.print();
// 。 。
//
/*
glibc detected *** ./a.out: double free or corruption (fasttop): 0x0809e078 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c501)[0x17c501]
/ lib/libc.so.6(+0x6dd70)[0x17dd70]
*/
}
/*
:
, ,
。
(operator=)
*/