C++学習ノート(3)

4958 ワード

原著:www.geocities.jp/ky_webid/cpp
第19章静的メンバー
staticキーワードの使い方:
1.静的グローバル変数と関数
2.関数内の静的変数、スタック上ではなく、静的領域
3.クラス内の静的変数と関数、スタック上ではなく静的領域
静的グローバル変数と関数:
外部使用不可
静的関数のメリットを定義します.
静的関数は他のファイルでは使用できません
他のファイルで同じ名前の関数を定義でき、衝突は発生しません.
≪静的ローカル変数|Static Local Variables|oem_src≫:静的ストレージ領域が存在します(スタックおよびスタックにはありません).
クラス内の静的関数と静的変数:copy
第20章Constメンバー
1.クラスのconstのメンバー変数は初期化を表示できません.(文字列の長さはできません)
class CStack{
private:static const int STACK_SIZE = 100; 
int m_data[STACK_SIZE]; 
};
不可!!対策は
class CStack{
private:enum{ STACK_SIZE = 100 }; 
int m_data[STACK_SIZE]; 
};

2.メンバー変数の初期化
class CSample{
public:CSample() : m_num(100){} // m_numを100で   
private:const int m_num;
};

3.CONST関数の定義:関数内では変更できません.
class CPoint{
public:
int GetX() const;
};
// constメンバ  の  
int CPoint::GetX() const{return m_x;}

4.constメンバーのリロード
const a a1;
a a2;
a1.x();
a2.x();
//a1  const  ,a2   const  。
5.const書き方
const int nValue;//nValueはconst
int const nValue;//nValueはconst
const char *pContent;//*pContentはconst、pContentは可変
const (char *) pContent;//pContentはconst、*pContentは可変
char const * pContent;//*pContentはconst、pContentは
char* const pContent;//pContentはconst、*pContentは可変
const char* const pContent;//pContentも*pContentもconst
char const* const pContent;//pContentも*pContentもconst
5.mutable:解const
mutableのメンバー変数は、クラス内のconst関数で変更できます.6.volatile
volatileとして定義された変数は、この変数が予想外に変更される可能性があるということです.これにより、コンパイラはこの変数の値を仮定しません.
正確には、オプティマイザは、レジスタに保存されたバックアップではなく、この変数を使用するたびにメモリからこの変数の値(From Memory)を慎重に読み直さなければならない.
同期しない可能性があります.
7.explicit
C++では、1つのパラメータコンストラクション関数(または最初のパラメータを除く残りのパラメータにデフォルト値があるマルチパラメトリックコンストラクション関数)が、2つの役割を果たします.1はコンストラクタ、2はデフォルトで隠されたタイプ変換オペレータです.explicitコンストラクション関数は、暗黙的な変換を防止するために使用されます.次のコードを見てください.
class Test1
{
public:
    Test1(int n) { num = n; } //      
private:
    int num;
};
class Test2
{
public:
    explicit Test2(int n) { num = n; } //explicit(  )    
private:
    int num;
};
int main()
{
    Test1 t1 = 12; //         ,   
    Test2 t2 = 12; //    ,           
    Test2 t3(12); //      
    return 0;
}

第22章友元関数とクラス
クラスに友元クラスが設定されており、そのクラスに本クラスのメンバーが存在する場合に、このクラスのメンバーのプライベートメンバーにアクセスできます.
// sample.h
class CTestFriend; // クラスの    
// CTestクラス
class CTest{
friend class CTestFriend; // CTestFriendクラスは、CTestクラスに  にアクセスできる
public:
CTest(int num) : m_num(num){}
private:
int m_num;
};

// CTestクラスのフレンド
class CTestFriend{
public:// フレンドである CTestクラスの privateメンバにアクセス
int GetFriendNum(CTest& obj) const { return obj.m_num;}
};

// main.cpp
#include <iostream>
#include "Sample.h"
int main(){
CTest test(123);
CTestFriend test_friend;
std::cout << test_friend.GetFriendNum( test ) << std::endl;
return 0;
}

クラスに友元関数を設定し、その関数でこのクラスのプライベートメンバーにアクセスできます.
class CTest{
friend int GetFriendNum(CTest& obj); // この  からはCTestクラスのメンバに  にアクセスできる
public:CTest(int num);
private:int m_num;
};// コンストラクタ
CTest::CTest(int num) : m_num(num){}// フレンド  
int GetFriendNum(CTest& obj){
return obj.m_num;
}
<iostream>
int main(){
CTest obj( 123 );
std::cout << GetFriendNum(obj) << std::endl;
return 0;
}

第23章RTTI
CBase base_obj;
CSub1 sub1_obj;
CSub2 sub2_obj;

// ↓ここの3つのどれか1つだけを  にして  してみる
CBase *p = &base_obj;
//CBase *p = &sub1_obj;
//CBase *p = &sub2_obj;

const type_info& info = typeid( *p );  //       を  
if( info == typeid( CBase ) ){
	std::cout << "CBase" << std::endl;
}else if( info == typeid( CSub1 ) ){
	std::cout << "CSub1" << std::endl;
}else if( info == typeid( CSub2 ) ){
	std::cout << "CSub2" << std::endl;
}

第24章強制型変換castはdynamic_を含むcast,static_cast,reinterpret_cast,const_cast staic_cast静的強制;1)関係のないポインタ間でstaticタイプ強制dynamic_を行うことはできませんcast動的強制1)派生クラスオブジェクトのアドレスを返します.2)ベースクラスポインタが次のカッコ<>で指定したタイプのオブジェクトを指すかどうかをテストします.
class B{
public:
int m_iNum;
virtual void foo();
};
class D:public B{
public:
char *m_szName[100];
};
void func(B *pb){
D *pd1 = static_cast<D *>(pb);           //  
D *pd2 = dynamic_cast<D *>(pb);     //     ,           
//       
}

reinpreter_cast (expression)
それは1つのポインタを1つの整数に変換することができて、1つの整数を1つのポインタに変換することができます(まず1つのポインタを1つの整数に変換して、この整数を変換します
元のタイプのポインタで、元のポインタ値を得ることもできます).
const_cast (expression)
この演算子は、タイプのconstまたはvolatileプロパティを変更するために使用します.constまたはvolatile修飾に加えてtype_idとexpressionのタイプは同じです>.
定数ポインタは非常量ポインタに変換され、元のオブジェクトを指します.
定数参照は非常量参照に変換され、元のオブジェクトを指します.定数オブジェクトが非常量オブジェクトに変換されます.