GeekBand C++オブジェクト向けの高度なプログラミング(第2週目)

3685 ワード

コースコード
ファイル: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        。