「C++」の編集履歴(バックアップ)一覧はこちら
「C++」(2011/01/27 (木) 19:16:57) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
C++
----
*ファイル読み込み
ifstreamによるファイルの読み込み
#highlight(c++){
ifstream inputFile( "data.txt", ifstream::binary );
inputFile.seekg( 0, ifstream::end );
int fileSize = (int)( inputFile.tellg() );
inputFile.seekg( 0, ifstream::beg );
char* fileImage = new char[ fileSize ];
inputFile.read( fileImage, fileSize );}
----
*constメンバ関数
constをつけて宣言されたメンバ関数はメンバ変数を変更することが出来ない。
constなメンバ関数からconstでないメンバ関数を呼ぶことは出来ない。
#highlight(c++){{
class classA{
public
void funcA() const;
int mInt;
} }}
funcA()の中でmIntの値を変更することが出来ない。
----
*クラスの宣言と定義
-クラスAがクラスBの実体を持つ場合、クラスBの定義が必要になる
--AのヘッダでBのヘッダをインクルードする必要がある
-クラスAがクラスBのポインタを持つ場合、クラスBの宣言だけで良い
--Aのクラス定義の前にBの宣言をするだけで良い
-関数の引数や戻り値に使う場合も宣言だけで良い
実体の場合
#highlight(c++){{
//ClassA.h
#include "ClassB.h" //インクルード必要
class ClassA{
ClassB b; //実体
};
}}
ポインタ・引数・戻り値の場合
#highlight(c++){{
//ClassA.h
class ClassB; //宣言だけで良い
class ClassA{
ClassB* b;
ClassB getB();
void setB(ClassB b)
};
}}
インクルードを減らすことでコンパイル時間の短縮に繋がる
----
*可変長引数
仮引数に...を書いて宣言し、va_listを使う
例:引数をそのままprintfに渡す自作関数
#highlight(c++){{
void myprintf(const char *format, ...){
va_list ap;
va_start(ap, format);
vprintf(format, ap);
va_end(ap);
}
}}
printfならvprintf、sprintfならvsprintのように、va_listを渡す関数が用意されている
va_listを自前で操作する場合はもう少しめんどい
----
*可変長引数マクロ
C99からの追加機能
#highlight(){{
#define SOME_MACRO(x, ...) some_func(x, __VA_ARGS__)
}}
ただし可変長部分の引数がないとカンマが残ってしまいコンパイルエラーになる
gccの独自拡張機能、##__VA_ARGS__を使うと可変長引数が無い場合カンマを除去してくれる
#highlight(){{
#define SOME_MACRO(x,...) some_func(x, ##__VA_ARGS__)
}}
----
//ポインタの引き算
C++
----
*ファイル読み込み
ifstreamによるファイルの読み込み
#highlight(c++){
ifstream inputFile( "data.txt", ifstream::binary );
inputFile.seekg( 0, ifstream::end );
int fileSize = (int)( inputFile.tellg() );
inputFile.seekg( 0, ifstream::beg );
char* fileImage = new char[ fileSize ];
inputFile.read( fileImage, fileSize );}
----
*constメンバ関数
constをつけて宣言されたメンバ関数はメンバ変数を変更することが出来ない。
constなメンバ関数からconstでないメンバ関数を呼ぶことは出来ない。
#highlight(c++){{
class classA{
public
void funcA() const;
int mInt;
} }}
funcA()の中でmIntの値を変更することが出来ない。
----
*クラスの宣言と定義
-クラスAがクラスBの実体を持つ場合、クラスBの定義が必要になる
--AのヘッダでBのヘッダをインクルードする必要がある
-クラスAがクラスBのポインタを持つ場合、クラスBの宣言だけで良い
--Aのクラス定義の前にBの宣言をするだけで良い
-関数の引数や戻り値に使う場合も宣言だけで良い
実体の場合
#highlight(c++){{
//ClassA.h
#include "ClassB.h" //インクルード必要
class ClassA{
ClassB b; //実体
};
}}
ポインタ・引数・戻り値の場合
#highlight(c++){{
//ClassA.h
class ClassB; //宣言だけで良い
class ClassA{
ClassB* b;
ClassB getB();
void setB(ClassB b)
};
}}
インクルードを減らすことでコンパイル時間の短縮に繋がる
----
*可変長引数
仮引数に...を書いて宣言し、va_listを使う
例:引数をそのままprintfに渡す自作関数
#highlight(c++){{
void myprintf(const char *format, ...){
va_list ap;
va_start(ap, format);
vprintf(format, ap);
va_end(ap);
}
}}
printfならvprintf、sprintfならvsprintのように、va_listを渡す関数が用意されている
va_listを自前で操作する場合はもう少しめんどい
----
*可変長引数マクロ
C99からの追加機能
#highlight(C){{
#define SOME_MACRO(x, ...) some_func(x, __VA_ARGS__)
}}
ただし可変長部分の引数がないとカンマが残ってしまいコンパイルエラーになる
gccの独自拡張機能、##__VA_ARGS__を使うと可変長引数が無い場合カンマを除去してくれる
#highlight(C){{
#define SOME_MACRO(x,...) some_func(x, ##__VA_ARGS__)
}}
----
//ポインタの引き算