C++


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

C++



ファイル読み込み

ifstreamによるファイルの読み込み
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でないメンバ関数を呼ぶことは出来ない。
class classA{
public
    void funcA() const;
    int mInt;
} 
funcA()の中でmIntの値を変更することが出来ない。



クラスの宣言と定義

  • クラスAがクラスBの実体を持つ場合、クラスBの定義が必要になる
    • AのヘッダでBのヘッダをインクルードする必要がある
  • クラスAがクラスBのポインタを持つ場合、クラスBの宣言だけで良い
    • Aのクラス定義の前にBの宣言をするだけで良い
  • 関数の引数や戻り値に使う場合も宣言だけで良い

実体の場合
//ClassA.h
#include "ClassB.h" //インクルード必要
class ClassA{
    ClassB b; //実体
};
 

ポインタ・引数・戻り値の場合
//ClassA.h
class ClassB; //宣言だけで良い
class ClassA{
    ClassB* b;
    ClassB getB();
    void setB(ClassB b)
};
 

インクルードを減らすことでコンパイル時間の短縮に繋がる




可変長引数

仮引数に...を書いて宣言し、va_listを使う

例:引数をそのままprintfに渡す自作関数
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からの追加機能
#define SOME_MACRO(x, ...) some_func(x, __VA_ARGS__)
 
ただし可変長部分の引数がないとカンマが残ってしまいコンパイルエラーになる
gccの独自拡張機能、##__VA_ARGS__を使うと可変長引数が無い場合カンマを除去してくれる
#define SOME_MACRO(x,...) some_func(x, ##__VA_ARGS__)
 



ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。