C++学習ノート(4)

8576 ワード

原著:www.geocities.jp/ky_webid/cpp
第25章異常
tryには保護するコードが含まれています.保護ブロックと呼ばれています.ガードブロックに異常が発生すると、自動的に異常オブジェクトが生成する放出される.catchは、特定の異常を捕捉、その中で適切な処理を行う.throwは、異常を直接放出/発生することができ、制御フローがcatchブロックに移行する.
try{ 
throw( "  が  しました" ); 
std::cout << "この は  されません" << std::endl; 
}catch( int num ){ 
std::cout << num << std::endl; 
std::cout << "  がここでキャッチされた  、この は  されます" << std::endl;
}catch( const char* str ){ 
std::cout << str << std::endl; 
std::cout << "  がここでキャッチされた  、この は  されます" << std::endl; 
}

第26章テンプレート
関数#カンスウ#
template<class T> T max(const T& a, const T& b) {
return (a>b) ? (a):(b); 
}

テンプレートクラス
template <class T>
class CStack{ 
public: 
enum{ STACK_SIZE = 100 }; // スタックサイズ 
CStack(){ m_sp = 0; } // コンストラクタ 
void push(const T& data); // プッシュ 
T pop(); // ポップ
private: 
T m_data[STACK_SIZE]; // スタック   
int m_sp; // スタックポインタ
};// プッシュ
template<class T> void CStack<T>::push(const T& data){ 
if( m_sp >= STACK_SIZE ) // スタックが   
{ 
std::cout << "スタックが  でプッシュできません" << std::endl; 
return; 
} 
m_data[m_sp++] = data; 
std::cout << data << "がプッシュされました" << std::endl; 
}// ポップ
template<class T> T CStack<T>::pop(void){ 
if( m_sp <= 0 ) // スタックが { 
std::cout << "スタックが でポップできません" << std::endl; 
return 0; 
}
T data = m_data[--m_sp]; 
std::cout << data << "がポップされました" << std::endl; 
return data; 
}
// main.cpp
#include "stack.h" 
int main(){
CStack<int> stack; // int を うスタックを   
stack.push( 100 ); 
stack.push( 200 ); 
stack.pop(); 
stack.pop(); 
stack.pop(); 
return 0; 
}
パラメータ定義テンプレートサイズ
#include <cstddef> 
#include <iostream>
// バッファテンプレート
template <class T, std::size_t SIZE> 
class CBuffer{ 
public:// コンストラクタ 
CBuffer(){}//    を す 
std::size_t GetSize() const{ 
return SIZE; 
} 
private: 
T m_data[SIZE]; // バッファ  
};
int main(){ 
CBuffer<int, 5>intBuffer; 
std::cout << intBuffer.GetSize() << std::endl; 
return 0; 
}

リロードタイプ変換演算子
class CSample{ 
public:// コンストラクタ 
CSample(float f){ m_float = f; } // intへの    
operator int() const { return static_cast<int>( m_float ); }// floatの を す 
float get() const { return m_float; } 
private: 
float m_float; 
};
#include <iostream> 
#include "sample.h" 
int main(){ 
CSample obj( 2.68f ); 
std::cout << obj.get() << std::endl; //   にfloatの2.68を  する 
int num = obj + 100; // num = obj.operator int() + 100; 
std::cout << num << std::endl; // 102を   
return 0; 
}

第30章内部クラス
class COuter{ 
public://   クラスの   
class CInner{ 
public: 
CInner(){ m_num = 100; } 
int m_num; 
}; 
int get() const { return m_obj.m_num; } 
private: 
CInner m_obj; //   クラスのインスタンス
}; 
COuter::CInner g_obj; //   クラスのインスタンス
#include <iostream> 
int main(){ 
using namespace std; 
COuter out; 
cout << out.get() << endl; 
cout << g_obj.m_num << endl; 
return 0; 
}

------------------------------------------------------------------------------------------------------
#include <iostream>
class COuter{ 
public://   クラスの   
class{ 
public:int m_num; 
}; 
void set(int num){ m_num = num; } 
}; 

int main(){ 
using namespace std; 
COuter out; 
out.set( 100 ); 
cout << out.m_num << endl; 
return 0; 
}

ローカルクラス、ローカルクラスの使用.内部クラスとは異なり、関数体内です.
void function(){// ローカルクラスの   
class CLocal : public CSample // CSampleが  できる {
public: 
CLocal(int num){ m_num = num; } 
int get() const{ return m_num; } 
private: 
int m_num; 
}; 
CLocal local( 123 ); 
std::cout << local.get() << std::endl;
}

第32章private,protectの継承
クラスのprivate/protect継承、継承されたサブクラスはpublic&protectにアクセスでき、privateにアクセスできません
外部ではクラス内のpublicメンバーを使用できますが、protectとprivateは使用できません.
異なるレベルの継承:
----------------------------------------------------privateはベースクラスメンバーprivateメンバーpublicメンバーprotectedメンバーの内部アクセス不可アクセス可能オブジェクトアクセス不可アクセス不可アクセス不可アクセス不可アクセス不可アクセス不可----------------------------------------------------------publicはベースクラスメンバーprivateメンバーpublicメンバーprotectedメンバーの内部アクセス不可アクセス可能オブジェクトアクセス不可アクセス可能クラス定義でアクセス可能、外部アクセス不可--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------アクセス不可-------------------------------------------------------------------------
第32章多重継承
class CBase1{ 
public: 
virtual void func(); //  かする
}; 

class CBase2{ 
public: 
virtual void func(); //  かする
};
class CSub : public CBase1, public CBase2 
{
public:
void func(); // CBase1::func()をオーバーライドしているつもり 
void func(); // CBase2::func()をオーバーライドしているつもり
};

int main() 
{ 
CSub* sub = new CSub(); 
sub->CBase1::func(); // CBase1::func()を び すように  する 
delete sub; 
return 0; 
}
多重継承は二義性を生み出し,不可能である.
第34章メンバー関数ポインタ
クラスメンバー関数ポインタの再定義.
// メンバ  ポインタを  
void (CSample::*pFunc)() = &CSample::func;
// .*   でのアクセス
(obj.*pFunc)();
// ->*   でのアクセス
(pObj->*pFunc)();

静的メンバー関数の取得
class CSample{ 
public: 
static void func(); 
};
int main(){//   メンバ  ポインタを   
void (*pFunc)() = &CSample::func; //   ポインタ  でのアクセス 
pFunc(); 
return 0; 
}

第36章Replacement New
char global_area[1000]; // グローバル  
int main(){// グローバル  に、char10  の  を  して、そこを すポインタを  
char* p = new(global_area) char[10]; 
::strcpy( p, "aaaaaaaaa" );
}

Replacement Deleteは複雑です
class CSample{ 
public: // デストラクタ 
~CSample(){ std::cout << "デストラクタ" << std::endl; } 
// CSampleクラス のplacement newとplacement deleteを   
static void* operator new(size_t size, void* buf){ return buf; } 
static void operator delete(void* p, void* buf){} 
static void operator delete(void* p){} // VC6.0では  
}; 
char global_area[1000]; // グローバル  
int main(){ 
CSample *p = new(global_area) CSample; // placement new 
if( p != NULL ) //     に  していることを   { 
p->~CSample(); //    にデストラクタを び す 
CSample::operator delete( p, global_area ); // placement delete 
} 
return 0; 
}

第37章テンプレートの特殊化
1.テンプレートintバージョン
#include <iostream>

   
   
   
   
// バージョン template <class T>  class CSample{  public:  CSample(){  std::cout << "class T version" << std::endl;  }  }; // int バージョン template <>class CSample<int> {  public: CSample(){ std::cout << "int version" << std::endl; }  }; int main(){  CSample<int> obj1;  CSample<double> obj2;  return 0;  }

結果:
int version 
class T version
#include <iostream>
//   バージョン
template <class T> 
class CSample{ 
public: 
CSample(){ std::cout << "class T version" << std::endl; } 
};
// ポインタ   バージョン
template <class T> 
class CSample<T*>{ 
public: 
CSample(){ std::cout << "pointer version" << std::endl; } 
}; 
int main(){ 
CSample<int> obj1; 
CSample<int*> obj2; 
return 0; 
}

結果:
class T version 
pointer version
第38章C言語との連携
/* test.h */
#ifdef __cplusplus 
extern "C" { 
#endif 
int function(int num); 
int function2(int num); 
int function3(int num); 
#ifdef __cplusplus 
} 
#endif
C++がヘッダCファイル対応ヘッダファイルを含む場合