C++のめちゃくちゃ

7377 ワード

1、newとdelete
int* pi = new int(0);	//      0

A* pA = new A();	       //       ,       ,       ,          A()     。

pA->function();delete pA;	 //       ,         ,       。

int *pi = new int[10];delete []pi;    //  10        

int **pi = new int[5][6];

delete [][]pi;//        。

const int *pci = new const int(1024);


動的に作成されたconstオブジェクトは、作成時に初期化され、初期化されると値が変更されません.delete p後、このポインタは懸垂ポインタとなり、メモリのいずれかの位置を指す可能性があります.ポインタが指すオブジェクトを削除すると、ポインタを0、すなわちNULLに設定します.これにより、ポインタがオブジェクトを指さないことが明確になります.
2、mallocとfreeのダイナミックメモリ管理でエラーが発生しやすい1、削除(delete)動的割り当てメモリへのポインタが失敗したため、ブロックメモリをフリーストレージ領域に戻すことができません.動的割り当てメモリの削除に失敗したことを「メモリリーク(memory leak)」と呼びます..メモリの漏洩は発見しにくいが、アプリケーションがしばらく実行された後、すべてのメモリ領域が消費されると、メモリの漏洩が現れるのが一般的だ.delete後に検出します.2、削除したオブジェクトを読み書きします.ポインタが指すオブジェクトを削除した後、ポインタを0に設定すると、このようなエラーが検出されやすくなります.3、同じメモリスペースに対してdelete式を2回使用します.2つのポインタが同じダイナミックに作成されたオブジェクトを指している場合、削除時にエラーが発生します.いずれかのポインタでdelete演算を行い、オブジェクトのメモリ領域をフリーストレージ領域に戻し、deleteの2番目のポインタに戻ると、フリーストレージ領域が破壊される可能性があります.3、constの使い方
1、定義後左の値は変更できないので、定義時に初期化する必要があります.constオブジェクトはデフォルトでローカル変数です.グローバルに使用するには、宣言externを表示する必要があります.ファイル1 extern const int buffersize=512;//定義ファイル2 extern const int buffersize;//使用2、constリファレンスはconstオブジェクトへのリファレンス
const int ival = 1024;const int &refVal = ival; 

int &ref2 = ival;   //n  _              

const                        

int i = 42;         

const int &r = 42;      //  legal for const references only

const int &r2 = r + i;    



double dval = 3.14;

const int &ri = dval;
 
//                    :   

int temp = dval;          // create temporary int from the double

const int &ri = temp;     // bind ri to that temporary 


riがconstでない場合、riに新しい値を割り当てることができます.これでdvalを修正するのではなくtempを修正しました.riへの付与がdvalを変更することを望むプログラマーは、dvalが変更されていないことに気づく.constリファレンスが読み取り専用であるため、constリファレンスを一時的に使用する必要がある値にバインドすることを許可するだけで、この問題は完全に回避されます.3、常針、針定数
const int* p1 = &i;//    ,         ,   int const* p1 = &i;

//*p1 = 2;         //          

p1 = &j;           //      ,        

int* const p2 = &i;//    ,    p2。     。    ,   

*p2 = 2;           //           ,

//p2 = &j;         //          

const int* const p3 = &i;//        

const int& ri = i;//    ,    ri  。                        

//ri = 10;    

i = 10;       OK


 
4、常関数//クラスを書くときは、できるだけ多くの常関数を宣言します.定数オブジェクトの呼び出し要件を満たす.int GetN()const//常関数は、関数内でクラスのデータメンバーを変更できません.//コンパイラはint GetN(const A*this)/クラスのメンバー関数である必要がある通常オブジェクトは、通常関数のみを呼び出すことができます.constはパラメータを修飾して、パラメータの伝達の効率を高めて、伝達パラメータが修正されないことを保証します!クラスのカプセル化を破壊しないように、データ・メンバーのアドレスや参照を返さないでください.const string& GetS() const {return s;}//const修飾で値を返す
4、static    int i;//インスタンスメンバー、オブジェクトに属し、各オブジェクトには独自のコピーがあり、オブジェクトからstatic int jにアクセスするしかない.//静的メンバー、クラスに属し、すべてのオブジェクトがデータを共有します.オブジェクト名またはクラス名でアクセスできます.    int A::k = 0;//静的メンバーはクラス外でstatic void function()を初期化する必要がある.//静的メンバー関数:thisポインタがなく、クラスのインスタンスメンバーにアクセスできず、クラスの静的メンバーにのみアクセスできます.5、int ivalを初期化する(1024);//直接初期化は、初期化式をかっこに入れる【より柔軟で効率的】int ival=1024;//初期化構文をコピーして等号(=)でリストを初期化するA::A():i(2),j(3),k(10){......}A::A(int a,int b):i(a),j(b){}//Aのプライベートデータメンバーi,j
6、クラス
1.コンストラクション関数Studioのプライベートメンバーm_ID,m_cName
Student::Student(char *pName, int ssId)

{

	m_ID = ssId;

	strcpy(m_cName, pName);

	cout << "construct new student" <<endl;

}


2.コピーコンストラクタ
Student::Student(const Student& Stu)

{

	m_ID = Stu.m_ID;

	strcpy(m_cName, Stu.m_cName);

	cout << "construct copy of" << Stu.m_cName << endl;

}


3.浅いコピーは自分で定義せず、C++のデフォルトのコピー構造関数は深くコピーする
Student::Student(Student& stu)

{

	cout <<"Constructing " <<stu.pName <<endl;

	pName=new char[strlen(stu.pName)+1];

	if(pName!=0)

	{

		strcpy(pName, stu.pName);

	}

}


7、ドメイン名空間
namespace N1{void F(){}}   //   

useing namespace N1;    F();  /  
N1:: F();

8、関数パラメータのデフォルト
int add ( int x,int y = 5,int z = 4 );  Y   

int add(int x = 3,int y,int z);   N
(default value)

9.ポインタへの参照を渡す
void ptrswap(int *&v1, int *&v2)  //int *&v1   v1     ,   int         。

{ 

    int *tmp = v2;                 //    ,v1       ptrswap           。

    v2 = v1;

    v1 = tmp;   

}         //        ptrswap(pi1,pi2)


10、ヘッダファイル1、ヘッダファイルは、定義2、定義constオブジェクト3、inline関数11、静的アセンブリと動的アセンブリではなく宣言に使用される
calss A{public:void f(){cout<<"a";}};

class B:public A{public:void f(){cout<<"b";}};

class C:public A{public:void f(){cout<<"c";}};

class D : public A{};   //    ,       ,     ,     。(         )

void Test(A& ra){

ra.f();//     f1            。      ,                   。

}

void main(){

	B b;

	A& ra = b;	

	ra.f();        //  a

	A* pa = &b;

	pa->f();      //  a

	Test (b);     //  a     //  A      virtual ,       ,    b;

}      


12、動的連結条件:1.ベースクラスの参照(ポインタ)で派生クラスのオブジェクトを指す2.虚関数を呼び出すだけで動的に結合する効果があります.
class A                    //    :        。     。

{

public :virtual void f1() {cout << "A f1" << endl;}	//         
};

クラスがベースクラスとして機能する可能性がある場合は、その構造関数を虚関数と書く必要があります.派生クラスの解析関数は自動的に虚関数になります
13、ポインタ1、ポインタ使用前に初期化!!!------>実行時のエラー初期化されていないポインタを使用すると、ポインタに格納されている不確定な値がアドレスとみなされ、メモリアドレスに格納されているビットコンテンツが操作されます.初期化されていないポインタを使用することは、この不確定なアドレスに格納されている基礎データを操作することに相当する.したがって、初期化されていないポインタをデリファレンスすると、通常、プログラムがクラッシュします.2、任意のタイプのオブジェクトのアドレス3、ポインタを指すポインタを保存できる特殊なポインタタイプvoid*
//  :

 int *pi = &i;

 int **ppi =π


使用シヨウ:2回参照解除2回サンショウ
cout<<**ppi<<endl;


4、ポインタと配列:
int *ip = ia;       // ip   ia[0] ia      。

int *ip2 = ip + 4;  // ok:   +4,     4   ,       ip2,      


ポインタは減算もサポートしています
int last = *(ia + 4)   //         ,       last

int last = *ia + 4     //        ,    +4


ポインタと下付き
int *p = &ia[2];     // ok: p     ia  2   

int j = p[1];        // ok: p[1]     *(p + 1), ia[3]

int k = p[-2];       // ok: p[-2]    ia[0]


ポインタ配列を巡る------ポインタが配列に相当する反復器
const size_t arr_sz = 5;

int int_arr[arr_sz] = { 0, 1, 2, 3, 4 };//pbegin         ,pend        

for (int *pbegin = int_arr, *pend = int_arr + arr_sz;pbegin != pend; ++pbegin)

      cout << *pbegin << ' '; //       


14、ビットオペレータ
unsigned char               bit1 = 0227      //10010111   

~  bitwise NOT(   )    bit2=~bit1;      //01101000 

<<  left shift(  )      bit1<<1          //00110110      ,   0

>>  right shift(  )     bit1>>2          //00100101      ,   0

&  bitwise AND(  )       bit      

^  bitwise XOR(   )     bit       

|  bitwise OR(  )        bit      


15、自増自減演算子後置++a+;
cout<<*p++<<endl;       cout<<*p<<endl;++p;


16、前処理によるデバッグ
int main()

{

   #ifndef NDEBUG

   cerr << "starting main" << endl;

   #endif

}


int main(){#ifndef NDEBUG cerr<<「starting main」<