GeekBand C++オブジェクト向けの高度なプログラミング(第2週目)
3685 ワード
コースコード
ファイル:string.h
テストファイルstring-test.cpp
三大関数(BigThree):
Class with pointer member(s)
Big Three:コピー構造(copy constructor)、コピー付与(copy assignment operator)、構造関数(destructor)コピー構造 コピー付与 解析関数 コピー構造:
例:
コピーの割り当て:
代入演算子(=)のリロード関数です.
例:
構造関数:
構造関数は、構造関数とは逆に、オブジェクトが使用するリソースを解放します.
例:
スタック(stack)とスタック(heap)とは
スタックとスタックの違い
スタックオブジェクトにポインタを向けることは絶対にできません.
クラステンプレート:
多くの場合、私たちが生成したクラスには共通の属性がたくさんあります.このとき、テンプレートクラスを生成することができます.
関数テンプレート:
ネームスペース:
注意:ヘッダファイル内のusingネーミングスペースは、ヘッダファイルを使用するプログラムに影響しません.
直接すべて開く:
部分的に開く:
ファイル:string.h
#ifndef __MYSTRING__
#define __MYSTRING__
class String
{
public:
String(const char* cstr = 0);
String(const String& str);// , , ,Big three
String& operator=(const String& str)// ,big three
~String();// ,big three
char* get_c_str() const {return m_data};//
private:
char* m_data;//
};
//String::function(...)
inline String::String(const char* sctr = 0)
{
if (cstr) {
m_data = new char[strlen(cstr)+1];//
strcpy(m_data, cstr);
}
else { //
m_data = new char[1];//
*m_data = '\0';//
}
}
//
inline String::String(const String& str)
{
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);// object pointer, friend
}
// class
inline String::~String()
{
delete[] m_data;
}
inline String& String::operator=(const String& str)
{
if (this == &str)//
{
return *this;
}
delete[] m_data;//
m_data = new char[strlen(str.m_data)+1];// str.m_data
strcpy(m_data, str.m_data);//
return *this;//
}
//Global-function(...)
#endif
テストファイルstring-test.cpp
int main()
{
String s1();// ,
String s2("hello");// ,
String s3(s1);// ,s3
cout << s3 << endl;//<
三大関数(BigThree):
Class with pointer member(s)
Big Three:コピー構造(copy constructor)、コピー付与(copy assignment operator)、構造関数(destructor)
コンストラクション関数が入力する最初のパラメータは、自己タイプの参照であり、外部パラメータにはデフォルト値があります.例:
Rectangle(const Rectangle& other);
コピーの割り当て:
代入演算子(=)のリロード関数です.
例:
Rectangle& operator=(const Rectangle& other);
構造関数:
構造関数は、構造関数とは逆に、オブジェクトが使用するリソースを解放します.
例:
~Rectangle();
スタック(stack)とスタック(heap)とは
Stack
は、ある役割ドメイン(scope)に存在するメモリ空間(memory space)である.たとえば、関数を呼び出すと、関数自体がstackを形成して受信したパラメータを配置し、アドレスを返します.関数本体(function body)内で宣言された任意の変数は、使用されるメモリブロックが上記stackから取得される.Heap
、またはSystem heapとは、オペレーティングシステムによって提供されるglobalメモリ空間を指し、プログラムは、ある種のブロックからいくつかのブロックを動的に割り当てることができる.スタックとスタックの違い
stack object
、その生命は役割ドメイン(scope)が終了する際に終了する.この役割ドメイン内のobjectは、自動的にクリーンアップされるためauto objectとも呼ばれます.スタックオブジェクトにポインタを向けることは絶対にできません.
heap object
、そのライフサイクルはdeletedによって終了する.deleteを使用しないとメモリリーク(memory leak)が発生します.役割ドメインが終了してもheap objectは存在しますが、ポインタのライフサイクルは終了します.つまり、ポインタ自体はstackに存在するため、役割ドメイン以外ではポインタが見えなくなり、ポインタが指すメモリを解放する機会がなくなります.クラステンプレート:
多くの場合、私たちが生成したクラスには共通の属性がたくさんあります.このとき、テンプレートクラスを生成することができます.
template
class complex
{
public:
complex (T r = 0, T i = 0): re (r), im (i) { }
complex& operator += (const complex&);
T real () const { return re; }
T imag () const { return im; }
private:
T re, im;
friend complex& __doapl (complex *, const complex&);
};
{
complex c1 c1(2.1,2.2);
complex c2(2,3);
...
}
関数テンプレート:
template
inline
const T& min(const T& a,const T& b){
return b
ネームスペース:
注意:ヘッダファイル内のusingネーミングスペースは、ヘッダファイルを使用するプログラムに影響しません.
using namespace std
{
...
}
直接すべて開く:
using namespace std;
部分的に開く:
using std::cout; cout 。