プログラミング > C++

C++に関するメモ




コンストラクタでメンバ変数の初期化のあれ

下記のコードのような初期化の式を見かけるが
これはどうやらそれぞれのコンストラクタを呼んで初期化してるらしい
すなわち、int a(10), b(20); と同義のコンストラクタ式である
class Foo
{
int a, b;
public:
    Foo() : a(10), b(20) {}
};
 

書式付きの標準出力

#include <iostream>
 
using namespace std;
 
int main() {
   cout.fill('0'); 
   cout.width(5);
   cout << 123 << endl;  //  00123 と表示される
}
 
iomanipというのを使うと次のように書ける
#include <iostream>
#include <iomanip> 
 
using namespace std;
 
int main() {
   cout << setfill('0') << setw(5) << 123 << endl;  //  00123 と表示される
}
 


例外処理について

try節投げられた例外をcatch節で受け取る。
throwで例外を投げるが、投げられるのは例外型だけでなくいろんな型を投げることができる
#include <exception>
 
class MyException : public std::exception {};
class Hoge {};
 
void myfunc1() {
    throw MyException();  // コンストラクタを呼んで(?)使う
}
 
void myfunc2() {
    thorw 123;     // 数値を投げることも可能、たいてい何でも投げれる
}
 
void myfunc3() {
    throw Hoge();  // こんなのだって投げられる!
}
 
void myfunc4() {
    MyException e;
    throw e;       // コピーコンストラクタが呼ばれ別のインスタンスが投げられる
                   // すなわち throw MyException(e); となる
}
 
void myfunc5() {
    MyException e;
    std::exception *p = &e;
    throw *p;      // この場合は throw std::exception(*p); のコピーコンストラクタになるので注意
}
 
int main() {
    try {
        myfunc1();
    }
    catch (MyException& ex) {   // このように参照型で受ける
    }
    catch (...) {  // ドット3個で あらゆる例外を受け入れる
    }
 
    return 0;
}
 
 


例外処理について2

関数宣言にどんな例外を投げるかを指示できる(C++11以降は非推奨らしい)
void myfunc1() throw(MyException) { // MyExceptionを投げることがある
}
 
void myfunc2() throw(MyException, int) { // MyExceptionとintの2種類の例外を投げることがある
}
 
void myfunc3() throw() {  // どんな例外も投げないことを意味する
}
 
class Foo
{
public:
    Foo(int v) throw() : val(v) { } // コンストラクタにも例外について記述できる
 
    int value() const throw() { // 当然メソッドにもつけられる
        return val;
    }
 
private:
    int val;
};
 
 























.

タグ:

C++ Cpp
最終更新:2014年10月10日 17:15