C++コマンド集のページ

2024.4.12 Taka Kondo's memos:   Linux|ROOT|C++|html|Perl|Python|TeX| TWiki|SVN|shell|vi|emacs|CMake|git|
C++トレーニングコース(2005坂本) | ATLASコーディングルール
ここでの項目:クラス継承コンストラクターenum列挙型STL(標準_Template_Library)string,vectorオブジェクトポインタ関数配列と構造体コンパイル/library演算Loop分岐入出力と文字列その他サンプル参考書
クラス : →topへ
class Car{ };base class宣言。class Car {private: double gas; public: void showGas();}; (最後に;が必要!gasはデータメンバ、showGasはメンバ関数。public指定ないとみなprivate。サンプル:Class.C, vector_class.cxx
privateメンバー関数はコンストラクター内で呼べる。またpublicでdummy(){loadICMParameters(); return; }を定義しておいてobj.dummy();と呼ぶ。
アクセス制御public(公開メンバー、ATLASではメンバーデータの公開を禁止していますので、基本的にメソッドのみ)。protected(継承クラスにアクセスを許す非公開メンバー)。 private(継承クラスにアクセスを許さない非公開メンバー。例えば基底クラスの中で厳重に管理されており、子クラスのメソッドから不注意に操作されたくないメンバーデータはprivateに設定する。)ATLASではクラス定義の中ではまずpublic、続いてprotected、最後にprivateメンバーを宣言する。
classメンバ関数の定義void Car::showGas() {------;}(::をスコープ解決演算子と呼ぶ。)使用例:member_function
class RacingCar : public Carclassの継承:クラスCarを基底として派生クラスRacingCarを定義する。publicはCarのpublic memberはすべてRacingCarのpublicメンバになることを示す。->Class.cc
インライン関数double getGas(){return gas;}のようにクラス宣言内で関数本体を定義する。;が{}の内側に移る。
Point Point::operator+(Point p)+演算子のオーバーロード。宣言は Point operator+(Point p);。参照引数は 形式上からポインターは使えず参照のみになる(Point operator+(const Point& p);など)。
フレンド関数よるoverloard演算子の両側の型が違うとき。friend Point operator+(int a, Point p);
return *this;単項演算子のoverload(例++)で、そのメンバー関数を呼び出したオブジェクト自身へのポインタを意味する。
変換関数(conversion function)operatotr double(){return gas;}はメンバーgasをdoubleに変換する。使い方はdouble g=(double)object;。
privateメンバ-データprivateと宣言され名前はいずれもm_で始まるのはATLASのコンベンション(静的メンバーをのぞき)。ATLASではメンバーデータの公開を禁止している。m_はメンバー変数(データ)のmかな。
静的staticメンバーデータクラスのオブジェクト生成・破棄と無関係に最初から最後まで存在しデータを保持し続ける。クラスに属する全てのオブジェクト値を共有される。個々のオブジェクトが作成されていなくてもアクセスできる。ATLASのコンベンションではs_始める。
テンプレートクラスいろいろな型を扱う雛形を提供する。クラステンプレートは template class XX {....}で、メンバ関数は template void XX::memberFunctuion(....)で与えられる。例:ClassTemplate.cc
前方宣言のclass Photonコンパイラーにクラス名を知らせておく->ここを参照
コンストラクター,   sample program:Class.cc :   →topへ
コンストラクタCar::Car(){gas=90;}クラス名と同じ名前のメンバー関数Car()で定義しobjectを作ったとき初期化操作をする。引数ないものはdefault constrctorと呼ぶ。定義されてない時はcompile時にdefault constrctorが作られるが何もしない。
Car::Car(double g=100);デフォルト引数(gas=100)を持つコンストラクターを定義すればデフォルトコンストラクター(引数なし)を兼ねデフォルト引数で初期化操作をする。しかし定義本体ではCar::Car(double gas){ }と=100は置かない。
Car::~Car()デストラクターはコンストラクターCar()で動的objectを作ったとき必要。
T::T(int i0):i_member(i0){ }イニシャライザーリストはコンマで切られたリストで、クラスのメンバi_memberは引数i0で初期化される。Skinner p.206,256
thisthis->でexplicitに表示した方が他人にわかりやすい この説明が分かり易い。T(T&)で唯一の引数は参照引数でなくはならない(Skinner p.227)。 (例:CopyConstructor.cc
Car& operator=(const Car& c);object copyのための代入演算子=のオーバーロード。 Car& Car::operator=(const Car& c){.......}で定義する。(例:CopyConstructor.cc
仮想デストラクタclass Shape {... public:virtual ~Shape( );...};仮想メンバーを持ったクラスのデストラクタは必ずvirutalとすることがATLASでは要求されている。
クラスの継承 : →topへ
派生クラス(derived class)宣言は class RaceCar : public Car{ }; 定義は RaceCar::RaceCar(int c, double g):Car(g){...}。ここで:Car(g)の部分はbase classのconstructorにg値を渡す時に加える。 これがないとbase classのdefault constructorが使われる。constuctorの呼出順序は当然base→derived。
メンバ保護:privateとprotectedprotectedは派生クラスからアクセスできるがpublicでない。
継承時のメンバ保護public継承ならbase classのアクセス制限が通用するが、protectedやprivateで継承すると外部から base classのpublicメンバーは派生クラスに属するのでprotectedないしprivateに変化する。
メンバ関数のoverridingbaseとderived classで同じメンバー関数を定義でき、derived classのそれが優先する。しかし base classのポインターが派生クラスobjectを指してもメンバー関数はbaseの方が使われる(X->YのときはXのclassのメンバー関数が使われる)。
仮想(virtual)関数virtual void draw();などとbase classのメンバ関数にvirtualを指定しておく。ポインターが指しているobjectに応じた適切なメンバー関数が呼ばれる。ここによれば「ポインタが仮想関数を呼び出した場合、オブジェクト型のよって呼び出す関数が決定します。ポインタから呼び出された時オブジェクト型に合わせて呼び出しす。最大の特徴は、この判断をコンパイル時ではなく実行時にしているという点です。仮想関数による動的なポリモーフィズムをオーバーライドと呼びます。」->例:virtual.cc
純粋仮想(pure virtual)関数virtual void showGas()=0;と関数を0で初期化した場合。一つでもこのような純粋仮想関数を持つクラスは抽象クラスと呼ばれオブジェクトを作ることが禁止されている。必ず継承したクラスを用意してそのクラスを使うこと。
抽象クラス(abstract class)純粋仮想(pure virtual)関数(virtual void showGas()=0;)を1つでも持つclass。 objectを作成できない。抽象クラスの純粋仮想関数は必ずoverridingされなくてはならない。overridingによって同じ名前の関数が さまざまな用途に使われることを多態性(polymorphism)という。 (坂本tutorial)抽象クラスは大規模フレームワークに利用者が開発した部品を組込むのに適した仕組み。組込みはフレームワークが提供する抽象クラスをベースにして自分の部品を開発する。少なくともすべての純粋仮想関数を実装しさえすれば、そのフレームワークの中で使える部品になる(この意味でこのような抽象クラスをインターフェースと呼ぶ)。Athenaはそのようなフレームワークの一つ。Athenaの中で使われるアルゴリズムやサービスはすべてインターフェースクラスを継承して作ることになる。
多重継承class Algorithm : public A, public B {...};のように2つのベースクラスを親に持つことができる。ATLASルールはメンバーデータを持ったクラスの多重継承を避ける。多重継承して良いのは、・純粋仮想関数のみを持つ。
仮想継承坂本ノートよりコピー)A→B、A→C、B→D、C→Dのような菱形継承のとき、基底クラスAのメンバーm_identifierをDで使うときはB経由かC経由を明示する(B::A::m_identifierとC::A::m_identifier)のは都合が悪い。元々m_identifierというのはオブジェクトの固有番号のつもりでつけており、Dクラスのオブジェクトも一つユニークなm_identifierを持つべきでしょう。クラスAは多重継承されても一つだけ引き継いでほしいので、仮想継承を使う。class B : virtual public A {...}; class C : virtual public A {...};virtualに継承することにより親の親が同一の場合、メンバーは一つだけ引き継ぐ。 大規模なソフトウエアシステムでは多重継承を使うことにより合理的に階層を実現することが出来ます。その場合仮想継承は重要な機能です。この節の最初の例、Algorithmも実はclass Algorithm : virtual public IAlgorithm, virtual public IProperty {...}; として定義されています。
オブジェクト :     →topへ
Car mycar;class Car のオブジェクトmycarを宣言する。
mycar.gas=25.5;mycarのデータメンバであるgasに25.5を代入する。外からはgasがpublicのときのみ有効。
mycar.setGas(27.3);publicメンバ関数setGas()を呼び出してprivateなデータメンバgasの値をセットする。
mycar.showGas();mycarのメンバ関数showGas()を呼び出す。
Car* pMycar;
pMycar= new Car;
pT = new int [n];
動的に生成されたT型オブジェクトのポインタ。newの時は必ずポインタになる! またdefault constrctorのみが呼ばれる。このような動的メモリー確保(dynamic allocation)は自分で責任持って開放すること。プログラム時に配列の大きさを決められるので文字列などに便利。TLatex *t=new TLatex(q, h,"c");とt=new TLatex(q, h,"c");は同じ!
delete p動的メモリーの解放。
(*p).x または p->xポインターpが示すオブジェクト(*p)のメンバーxを呼ぶ。->は選択(アロー)演算子と呼ぶ。
代入によるコピーa = b;のときassignment operator = をオーバーロードしておかなくれはならない。 動的objectを作る場合は明示的に指示しておかなくてはならない。
初期化によるコピーT a = b;のときはコピーコンストラクター(上記参照)が呼ばれて初期化される。
enum列挙型 :   →topへ
enum(イーナム)クラス列挙型はグループ化した定数を定義する。enum 新しい型名{定数名 = 初期値, ・・・ };と書く。初期値には整数のみ。サイズはint型と等しくなる。省略した初期値は0から始まり次は前者+1となる。(E_Dog::Poodle)でintにできる。例->enum_cast.C,enum_test.CenumAZZ.C,。
STL(標準_Template_Library) :STL解説,蔵重の中級入門@岡山,STLページ(日本語):   →topへ
STL(Standard Template Library)はC++標準ライブラリの中に含まれているクラス群のこと。テンプレート化されているので型を選ぶ必要がない。
コンテナ
iterator
コンテナ入門、データを管理するテンプレートクラスのこと。vectorやlistのように要素が連続的に並ぶコンテナはシーケンスコンテナ。setやmapのように要素が常にソートされた状態を保つコンテナを連想コンテナと呼ぶ。begin() は最初の要素、end() は末尾要素の1つ後ろを指す iterator を返す。1つ後ろを指す理由はループの終了条件に利用するため。->iterator.ccのようにfor(; it != array.end() ; ++it )ができる。
std::string aa("abc")文字列の操作をより使いやすくする。string s="TT", becname[3] = {"EndcapC","Barrel","EndcapA"};などと出来る。文字列への変換はaa.c_str()。文字列からの変換はs=Form("%s",line)。aa.size()。->string.cc string str1 = "Code Database"; str1.empty(),str1.size(),str1.find("D"),str1+str2  連結,str1.substr(5)5番以降の文字列(0から始まる),str1.substr(5,3)は5番以降の文字列3文字,str1.erase(i) str1.erase(x,y),string str3 = str1.erase(str1.find("D"))はD以下を消す。string str2 = str1.replace(5,4,"X")は5文字目から4文字をXで置き換える;string str1 = regex_replace("aaa-bba", regex("a"), "z")はaを全てzに置き換える;比較はif(s==t)やif(s=-"DD") ; 文字列を数値に変換:int i=stod(string),double d=stod(string) 。特定文字の消去はstring_erase.C;特定文字列の置換はstring_replace.C
stringの分解関数vector split_string(string x)を作ってstd::vector<string> ssに放り込む。read_textdata_string_direct.C(no split)
vector>string<
によるtext入力
vector s; while(getline(fin,line)) s.push_back(line);の2行で行ごとに違う長さのtext dataも一気の読める。その後splitで分解する。read_textdata_string.Cまたはread_textdata_string_direct.C(no splitで)
std::array<int, 6>固定サイズの配列を格納するのに使うことができます。これはリソース効率が良く、size() というサイズを取得するためのメソッドを内蔵。std::array<int, 10> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int>C++のvectorまとめ, 動的配列(DynamicArray)をテンプレートクラスで表現したも。動的配列なのでその要素数は必要なときに自動的に変更される(専用のメンバ関数を呼び出して要素を追加していることが条件)。 vector.cc, vector_class.cxx。専用メンバ関数:push_back()、 insert()、clear()=全要素削除、pop_back()=末尾要素の削除(戻り値なし)、size()=要素数を返す、resize()これができるのは便利かも。 empty()=空かどうか。v.clear()で全部を削除。 std::vector vec[8]も可能だ!vector_array.C, VEC[0]から始まる、だから最後(現在)の内容はVEC[VEC.size()-1]。for(auto x: v)cout<<x<<endl;で全部が見える(for_vector.C)。初期値設定:std::vector<int> VEC[10]={{8,88,888,809},{7,7},{923}};(=なくてもいいようだ)vector_initialize.C 、erase()、remove()は注意必要see this, 引数渡し
vector->グラフstd::vector HV, Eff; HV.push_back(VB); のあとでauto h = new TGraph(HV.size(),HV.data(),Eff.data());
vector pair対にセットできる vector<pair<int, string>> v; v.push_back({9, "apple" }); vector_pair.C, for (auto A : v) cout << A.first <<" "< < A.second<<endl;できる。sortはpairの1番目対称みたい。初期化:vector<pair<string, string>> XY{{"cathode","OuterVoltage"},{"anode_p11","TotalCurrent"}}; if(v[0]==v1)可能
sortvector_sort.C, 昇順 std::sort(vec.begin(), vec.end()); 降順(ascending order) std::sort(vec.rbegin(), vec.rend());
一時的バッファに利用std::vector<char> buf( size );とすると new演算子が vector の内部に隠されるので、delete を明示的に呼び出す必要がない。この関数から抜けると必ず vector のデストラクタが呼び出される。この言語解説参照
std::list<int> 双方向リスト(各要素が次の要素へと前の要素へのポインタも持っている)を構築したテンプレートクラスのこと。この言語解説iterator解説を参照。例:list.ccIterator.C
std::vector<Particle*> &AAParticle型の可変長配列(vextor)のAAをSTLのコンテナvectorで設定する。AA.push_back(a), AA.size(), AA.......などがある。->sample program vector.cc,invmass.cc
イテレータiterator(反復子)iterator解説,for(std::vector<int>::iterator it = array.begin(); it != array.end();++it) とすると簡単にloop回せる。autoでもっと簡単に for( auto itr = array.begin(); itr != array.end() ; ++itr )でもいい(Iterator.C)。 vector「array」のイテレータのインスタンス化:iterator.cc, for(auto x: v)cout<for_vector.C)!for(; it != array.end() ; ++it )もできる。
動的配列Web説明 @new()演算子を使用 deleteが必要 Astd::unique_ptr メソッドを利用 Bstd::make_unique() メソッドを使用例make_unique.C
ポインタ : サンプルpointer.cc    →topへ
std::unique_ptr std::unique_ptrは、動的に確保されたポインタを格納し、std::unique_ptr がスコープから外れたとき、メモリを delete します。unique_ptr_try.C。 名前の所以は、「あるオブジェクトの所有権を持つunique_ptrは、 ただ一つのみである」ところにあります。一つのオブジェクトを二つのunique_ptrに割り当てようとするとエラーになりますが、38行目のように所有権の移動(move)をするのはOKです。この操作の後ではptrはオブジェクトを所有していない状態になります。unique_ptrはオーバーヘッドがほとんどなく、通常のポインタに匹敵する処理速度で、余計なメモリ領域も使わないので他のスマートポインタを使う必要がなければこれを使います.
std::make_uniquestd::make_unique, C++14で追加されたstd::unique_ptrクラスのオブジェクトを生成するヘルパー関数です。ヘルパー関数を使用することでnewの呼び出しは不要となります。
shared_ptrshared_ptr_try.C
int *pA;pAはint変数のポインター。例:double* px=&x;。複数ならint *pa,*pbとせよ。 ポインター自身はアドレスだが型指定(int*など)が必要。int* pでもint *pでもいい。
*pAポインターpAが示すアドレスを参照する。*をindirecto operator(間接参照演算子)と呼ぶ。
pA=&a変数aのアドレス&aとpAに格納する。aと*pAは同じ変数aの値を示すことになる。
int& rA=a;参照(reference)rAを変数aで初期化する。rAはaの別名となり以後全く同じものを示す。しかし後でrA=aはできない。
関数 :   →topへ
関数名(引数リスト);関数の呼び出し。ふつう.h内でprototypeを宣言しておく。
void show(int x=0);デフォルト引数(default argument)を使う。このとき実引数なしで呼ぶとデフォルト値が使われる。複数の引数のときはそれより右の引数は全てデフォルト引数が指定されなければならない
引数のdefault値double Sqrt(double x, double acc = 0.01);のように引数のdefault値がある場合、呼ぶ時は省略可能a=Sqrt(a)でよい。クラスのメンバ関数ではデフォルト引数を使用できません。連続した右の引数だけが省略可能。−>default_argument.C, function.cc
void showNumber(int x);関数宣言(function declaration)。戻り値の型 関数名(仮引数){ }。voidは戻り値が無い場合。voidのときreturnはいらない。
& と *アドレス演算子 & (アドレスを取得する。&xは変数xのアドレス)と間接演算子 * (アドレスからアクセスする*(&x)=123はx=123と同じ) int* P(int *p)のpはpointer変数(アドレスをキープ)と呼ぶ。。
void F(int x);
使うときは F(x);
値渡し(by value)でこのときは実引数が「コピーされて」渡される(仮引数という)。従ってサイズが大きいと時間かかる。また関数の中からxを変えても元のx(実引数)は変わらないので注意。参照渡しならそうでない。-->function.cc, f2.cxx
void F(int* y);
使うときは F(&y);
参照渡し(by reference)で引数はポインターを介して渡す。実引数側はF(&y)と入れ、関数内は*yとして使う。-->function.cc, しかしyがy[5]のように配列だったらすでにpointerだからF(y)と使う。f2.cxx
void F(int& z);
使うときは F(z);
これも参照渡し(by reference)であるが引数に参照を使う。実引数側も関数内も変数zでポインター(&zまたはpz)ではない事。-->function.cc, f2.cxx
void F(const int& z);関数内で実引数zの値を変更を行わないことを明示。関数内で変更するとエラーになる。 。
return x;xは戻り値。式でもいい。無いときはreturn;
関数のオーバーロードfunction overloading(関数の多重定義)。引数の型や数が異なる同名の関数を複数定義できる。戻り値の型 だけが異なるのはだめ。
関数テンプレート扱う型以外は全く同じ処理を行う関数はコードを一つにまとめることができる。
template <class T> T maxt(T x, T y){...........}。例:FunctionTemplate.cc
インライン関数inline 戻り値の型 関数名(引数リスト){........}。compile時に関数を呼び出すコードの位置に 関数本体を埋め込むのでプログラムが速くなる。
Library関数#include , cos(x), sin(x), tan(x), acos(x), asin(x), atan(x), atan2(y,x), ->Linux library functions
const メンバ関数
mutable
constメンバー関数_mutable.jpg 説明, Web参照 mutable メンバ変数は変えられる.mutable.txt
配列と構造体 :   →topへ
initializationx[n][j]={{}};で内容を0にしてくれる。array_initialization.C
int A[3][2]={{0,2},{3,-1},{4,5}};配列の定義と初期化を同時に行った。 後ろから回る: m[3][2]={{0,2},{23,-21},{104,205}}は n[3][2]={0,2,23,-21,104,205};と同じ。 int A[3][2]はint A[][2]でもいい。{initializer}と呼ぶ。
配列名AはA[]の先頭番地のポインターである。*AはA[0]と同じ。2次元の場合B[][]の場合はB[]がポインターになる。
double F(int a[]);
使い方:double F(A);
配列A[]のポインターAを引数にしている。ポインター渡し。
double F(int* pA);
使い方:double F(A);
配列A[]のポインターAを引数にしている。関数の中で*(pA+i)などと使える。
このときは pA[i] と使用してもよい。ポインターpAのi個先の要素を指す。pA[2]は*(pA+2)と同じ。
構造体struc同じ型でない変数の集合に単一の名前をつける。name.member名で扱う。選択演算子、ドット演算子。 C++配列と違い、異なるデータ型のデータや関数を「メンバ」として複数個定義する。構造体は「struct」キーワードを用いて定義します。そして{ }の中身にメンバ(変数や関数)を定義していきます。構造体は「struct」キーワードを用いて定義し{ }の中身にメンバ(変数や関数)を定義。struct.C参照          
コンパイル :   →topへ
g++ --versioncompiler のversionを出す。
g++ test.cxxcompile, linkをして実行ファイルa.exeを作る。
g++ -c func.cxxcompileしてobject file func.oを作る。
nm func.oオブジェクトファイル中の情報を見る。
g++ -o b.exe program.cc func.olinkして実行ファイルb.exeを作る。
ar r libl3.a func.o func4.oarはarchive。libl3.aというlibraryを作る。必ずlibXXX.aと最初にlibが必要。
g++ -o funcdemo.exe main.o -L. -ll3 -o funcdemo.exeは出力ファイル名指定。main.oがエントリーポイントです。-L.はライブラリファイルを探すパス指定(. ピリオドは現在のディレクトリ) リンカー(g++のこと)は-Lオプションで指定されているディレクトリを探す。 LD_LIBRARY_PATH環境変数が設定されているとそこに含まれているパスを順番に探す。さらに見つからなければ その言語コンパイラがインストールされた標準のライブラリのあるディレクトリ(/libや/usr/lib等)を探す。
-lオプションはライブラリファイルの指定。libXXX.aのXXXの部分を-lに続けて記述する。-ll3とあるのは-lに続くl3を 使ってlibl3.aというファイルを指定。-lmとあるとlibm.aが指定。->
CMakeCMakeLists.txtという設定ファイルを作成しておけば、そこからCMakeがサポートする任意のプロジェクトファイルを作成することができます。
CMake入門1
演算・Loop・分岐 :   →topへ
初期値設定int nlines(9)
& , | AND , OR bit by bit ->and.cc
i=0x1 << 8 LSBから9th bitに1を立てる->bit.cc,and.cc
==、!=、<、>、<=、>=関係2項演算子で、==等しいとき真、!=等しくないとき真
&&, ||, !, &=, |=, !=, ^= 論理演算子で、&& (AND), || (OR), 単項演算子:! (NOT), &=(and_eq), |=(or_eq) (例はbit.cc), !=(not_eq), ^=(xor_eq)
bool型変数true, falseの2値。 bool型とint型は相互に変換される(true ─→ 1, true ←─ 0以外, false ←→ 0)
if(a==b)Y;else Z;if(i>10) {i = 10; j=20;}、if(a==b) k = iarray[ i ]; else k = 0; if (a == 0) { XXX; } else if (a == 1) { YYY; }}
if(a==b)Y;else Z;if(i>10) {i = 10; j=20;}、if(a==b) k = iarray[ i ]; else k = 0;
a=(a>max)?max:a;maxより大きければmaxに置き換えるー>if.cc
switchswitch(式) {case 値1: 文; case 値2: 文.......; default: 文;} break;が各終わりに必要!->switch.cc
for( )文for(初期化式; 判定式; 更新式 ) 実行文 例:for( int i = 0; i < 10; i++ ) ここで++iもi++も同じ->for.cc, 10を含む時は for( int i = 0; i != 10; i++ ) とする。
for (auto x: v) std::vector v; for (int& x: v) { } または C++11 ではfor (auto x: v) { } が追加された。for_vector.C
if(...)continue;xxxxx;loopの中で、その後に続くxxxxx部分ををスキップするがloopは最後まで実行する。returnでは抜ける。->for.cc
if(...)break;一番内側のループを終了する。->for.cc
while(式)文式を評価し、真であるかぎり文を実行する。偽であればwhile文を終了。
do 文 while(式);無条件に文を実行し、その後式を評価する。真であれば文を繰り返し 実行する。最初から式が偽であっても一度は実行される。
絶対値abs, fabsabs(int), fabs(float)であるがISO C++ には#include でusing namespace std;ならabs()はどの型にも使える->abs.cc
余り,fmod(x,y)整数のときia%ibで余りが出る。x/yの余りを示す。fmod(i,y),fmod(float(i),float(k))はいいがfmod(i,j)はよくない。少数部分はfmod(x,int(x))。
整数へ変換int ix = (int) x
pow(x,2)x*xなどの累乗、冪を表す。sqrt(pow(x,2)+pow(y,2))
sleep(5)5秒間停止する。#include <unistd.h>が必要
入出力と文字列 :     →topへ
txtデータの入出力
ios::app
fin.fail()
ifstream fin("1hist.dat") (またはifstream fin[5];fin[2].open("vv.txt"); ) while (fin >>X>>N>>)このとき12-5とspaceなくても分けてくれる。; fin.close();ーー>ifstream_ofstream.C 出力はofstreamで対応するファイルがなければ新しく作ってくれる。最初の行をスキップするときは char line[255]; fin.getline(line,sizeof(line)); で。出力:fout<<" "<<b<<endl;が必要。appendするときは ofstream fapp("out.dat", std::ios::app);とおく。ファイルが存在するかはif(findmean.fail()) で判断し存在しなければ最初の行にtop lineを書き、それ以外の場合はappendするのみの場合はー>check_file.C参照。\n for CRLF. 参照
行読みgetline()char line[22];fin.getline(line,sizeof(line)), string ssの時はgetline(fin,ss)
stringで読み込むifstream_string.C
std::cout << "xx" << endl;xx をモニター画面(に結びついたoutput stream)に出す。endlは改行操作関数。std::は標準名前空間を示す。
改行とタブ"....\n....", "......\t.........."
cout.width(10) (書式指定)表示幅の指定をする。#include が必要。ただし指定をした次の出力に限り有効。ー>cout_format.cc , std::cout.setf(std::ios_base::fixed,std::ios_base::floatfield);
setw(5)処理子を使った書式指定。#include <iomanip><iostream>cout << setw(5) << 3.1 << ":" << setw(10) << 2.5 << endl;ー>cout_format.cc,
小数点以下の出力設定cout<<setprecision(6)<<setiosflags(ios::fixed)<<endl;これを1回行っておいてからcout<<setw(10)<<y<<setw(10)<<z<<setw(10)<<a<< endl;とすればそろう。setwは出力毎に必要。例:ifstream.cc
std::cerr << "xx" << endl;xx をoutput redirectionしてもモニター画面に出す。>& logならlogに行く。
std::cin >> a >> b >> c ;キーボードより入力する。 
8進法、16進法i=0777; , j=0xfff;
16進法などの出力left,right 左寄せ、右寄せ dec,hex,oct 10進、16進、8進、 setw() フィールドの文字数指定、setfill() パティング文字 showbase :16進,8進のプレフィックスを表示(0x,0) 、boolalpha :true,falseのシンボル表現、注:引数を取るマニピュレータは、#include <iomanip>が必要。参照webhex_octal.cc
printfでprintf("%10.6f\n",date1);  --> 20161123.232516
sprintf 文字列つくりfname= new char[15] またはponiterを使ってchar * str="XYZ"でもいい。;sprintf(fname,"VC_%dV.root",VD);sprintfが最後に加えるので終了のヌル文字fname[14]=0はいらないみたい。。例:sprintf.cxx.txt。TFile *f = new TFile(fname);例cha_string.C; int を出力する %d , %ld( long int), %f(double %10.5なら10文字幅で小数点以下5桁を指定) ,%s(文字列),%%(% 自体)%c(文字)%10d(10 桁。10桁いかは左側を空白)%-10s(右詰めする)%05d( 5 桁で表示。10桁に満たない場合はゼロパディング表示) printf("%.*s", 2, str); (桁数を動的に変更する場合は .* とする)
Formsprintfの代わりに ifstream fin(Form("VC_%dV.root",VD));と直接使える。
数値ー>文字列#include <iostream>、stringstream ss; ss<<"sample"<<i<<".dat"; cout <<ss.str()<<endl; 追加のみなのでss.clear(); または ss.str(""); →stringstream.cc, sprintfを使う方法ー>sprintfの例
文字列ー>数値 sscanfsscanfを使う。dateやtimeの分解にいい
文字列ー>数値 atoiatoiを使う。ss<<"3.14"; ss>>pi; ??
stringー>数値 int:stoi(), long long:stoll(), doulbe:stod(), float:stof(), long:stol(), long double:stold(), unsigned ong;stoul), unsigned long long:stoull
static_cast静的な型の式を別の静的な型のオブジェクトの値に変更。static_cast_test.C
文字列の分割 splitsplit.cc,
charの配列char ff[][3]={"test-0","test-1","test-2"}; ff[][]でもいいみたい。例:Char_array.cxx
文字列探しreadChar.cc
ifstream,ofstreamによる入出力ofstream fout("ofstream_data.txt"); fout.close(); など ーー>例:ifstream.cc, dcs_average.cxx , 数字と文字混合の場合はread_mixed.cxx
特定行の選択ifstream.cxx > output.DAT
その他 :   →topへ
スコープ(利用範囲)変数やオブジェクトがどの範囲まで見えるかを表したも。(1)大域(global)変数:プログラム上のいかなる場所からも見える。(2)クラスメンバーデータ:メンバー関数の定義の中から見える。ATLASではメンバー関数をm_で始める。 (3)局所変数:関数の中でのみ見える.(4)複文中の局所変数:複文(if, forなど)の中でのみ見える。 同じ名前のものが重なる場合はより内側のものが採用され、::を前につければglobal変数を示す。ATLASでは同じ名前を異なる場合に使用することは禁止。
スコープ演算子 ::派生クラスの中からBaseClassのvfuncを使いたいときはBaseClass::vfunc();
./ZZ < input.script >& loginput.script入力でZZを実行し、すべての出力をlogに出す。
i += 2i=i+2
&& || ! .and. .or. not.
short, unsignedshort int(2 bytes, -32768-+32767),int(4 bytes,-2147483648〜+2147483647),unsigned int(4 bytes,0〜4294967295)
double xdouble precision float型の変数 x を定義。float(4 byte, 3.4E-38〜3.4E38) double(8 byte,1.7e-308〜1.7e+308) long double(8 byte,1.7e-308〜1.7e+308)がある。
const double pi=3.14定数識別子piの定義、この変数(pi)は値を変更できない。この「=」は代入演算子でなく、定数識別子とその初期値を区別しているだけ。(Skinner p.81)-->const.cc
int main(void)void識別子は引数がないことを示す。Cの流れで引数のvoidは省略できる。
void f(int n);関数fは整数引数をもつが値を返さない関数なのでvoidと書く。
キャスト演算子int id = (int)(d*pi); div=(double)n1/(double n2); などの(int), (double)を言う。
dynamic_cast(A)ここより引用: 実行時に型を判別して安全にダウンキャストするキャスト演算子。 C++ では実行時にも型の情報を利用でき、これを実行時型情報 ( RTTI: Run Time Type Information ) と言います。 ポインタの変換の場合、ダウンキャストが可能ならばダウンキャストしたポインタが、不可能ならば null が返されます。
bool型変数bool型変数にはC++で追加されている予約語のtrue 及び false いずれかを代入。trueは0以外の値、falseは0。 C++のbool型は整数型と関係しているためインクリメントするとtrueになる。デクリメント -- 動作は保証されない。ここより引用。サンプルbool.cc
namespace myspace{int n;......}名前空間の宣言:myspace::n = 1002と使える。例:namespace.cc
using namespace myspace;名前空間のusing宣言(using directove)を使うとそれ以後は「myspace::」を省略できる。
#ifndef __MYHISTOGRAM_Hインクルードガード。もし__MYHISTOGRAM_Hが未定義ならば、#defineで__MYHISTOGRAM_Hを 定義し#endifまでを読み込む。定義済みであればそれ以降#endifまでの部分をスキップ。この仕組でクラスの定義が二度出現することを避ける。
rand()random number generation: example->random.cc, random.cxx
#ifndef〜#endif#define XXXXXでマクロが定義されていない場合に#ifndef〜#endif間のコードが有効となりコンパイルが行われます。逆に#ifdef〜#endifの間ではマクロ定義が行われていたら
サンプルプログラム :   →topへ
Car.ccconstructor内で動的objectを作りdestructorで消する練習。 出力結果
Class.cc クラスの基本動作(overloading constructor, destructor, virtual function, 派生class, 動的object)の練習。出力結果
CopyConstructor.cc コピーコンストラクターの練習。出力結果
AbstractClass.cc 抽象クラスVehicle-->派生クラスCar, Truckの練習。出力結果
vector.ccvectorの練習
pointer.ccポインターの練習
random.ccランダム数発生 random.cxx
参考書 :   →topへ
高橋麻奈著「やさしいC++」第2版\2,600、出版社ソフトバンク パブリッシング。 非常に丁寧で最後はcopy constructorなどまである。初心者には打ってつけで楽しく学べる。おすすめ。
M.T.Skinner著「C++基礎講座」改定新版(1999.12)出版社インプレス、 初心者には途中から急に難しくなりすぎる。しかし「やさしいC++」をマスターした後の参考書としてはすばらい!


Send your comments on this page to kondo@kekvax.kek.jp