忍者ブログ

てんねんのSE備忘録

てんねんのためのSE備忘録 間違い指摘いただけると助かります また、拍手なんかしていただけると喜びます

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

C++:クラス内での定数宣言

●整数の定数(enumハック)

古いコンパイラでは通常のconstの宣言ではコンパイルエラーになる

class CStack
{
    private:
        enum{ SIZE = 100 };  //const型のint型になる
        int data[SIZE];     
};

参考サイト
http://www.geocities.jp/ky_webid/cpp/language/020.html

●整数以外の定数

ヘッダ側
------------------------------------------------------
class fix_class
{
public:
    const double FIX;   //double型の定数
public:
     fix_class():FIX(1.2){}
}
-------------------------------------------------------

⇒FIXを1.2で初期化
※すべての派生クラスメンバーの構築前に基本クラスコンストラクタは呼び出される

これでint型以外は可能になります

拍手[0回]

PR

C++:関数を引数に設定する

C++:関数を引数に設定する

関数を引数に設定することで
関数に汎用性が大きくなる

ということで
今回は関数を引数に設定する方法です

さっそく、Cでの例を挙げます

●例1(Cの場合)
int funcA(int a, int b,int (*funcB)(int,int)){
    
    int c = funcB(a,b);
    
    return c;
    
}

funcBには引数にint型の変数2つを取ることができ、intを返す関数が入ります

●インラインとは何??

C++ではもっとオーバーヘッドを無くす(速度を上げる)方法があるそうで
それがインライン関数みたいです
インライン=マクロみたいなものです

⇒基本的な書き方
inline int A(int x){
    return x;
}
⇒注意
コンパイル時にプリプロセッサにより全て展開されるので実体は使用分だけ存在してしまう
つまり、コンパイル後の実質的なメモリが多くなる??ってな感じだと思います

と、C++の場合に入る前にもう1つ知識がいるようでして…

●テンプレート関数(template<引数の設定>)とは??

どんな型でも1つの関数で扱えるようにする仕組みを持っているのが
テンプレート関数だそうです

template<class T>
T max(const T& a, const T& b)
{
    return ( a > b ) ? ( a ) : ( b );
}

※class = typenameでも良い

例えばmax( 100, 150 );で上記のテンプレート関数を呼び出した場合
int max(const int& a, const int& b)
{
    return ( a > b ) ? ( a ) : ( b );
}

となるみたいです
知識無さ過ぎですねw
勉強しまっす

では、C++の場合の例に移ります

●例2(C++の場合) インライン展開

template<typename STRUCT, int SIZE>
void initialize(int matrix[SIZE][SIZE])
{
    for(int row = 0; row < SIZE; ++row)
    {
        for(int col = 0; col < SIZE; ++col)
        {
            matrix[row][col] = STRUCT::generate(row, col);
        }
    }
}

struct struct_A
{
    inline static int func(int, int)
    {
        return 0;
    }
};

struct struct_B
{
    inline static int func(int row, int col)
    {
        return (row == col) ? 1 : 0;
    }
};

int main(int, char* [])
{
    int m[10][10];

    initialize<sturct_A>(m);
    initialize<sturct_B>(m);

    return 0;
}

※initializeのtemplateのSIZEを呼び出していませんが
引数に配列を入れた時点で設定されるようですね

構造体のstruct_Aとstruct_Bどちらを選択するかによって
関数の内容が変わるようになっています

●まとめ
Cの記述は楽
C++の記述は面倒だけど、プログラムの速度アップにつながる
(ただし、メモリが大きくなる)

拍手[0回]

C++:列挙型enum

C++列挙型enum

enumの基本的な使い方を調べました

●宣言
enum <列挙の名前> {タグ1, タグ2, タグ3・・・};
<列挙の名前> <変数の名前>;

or

enum <列挙の名前> {タグ1, タグ2, タグ3・・・} <変数の名前>;

●使い方
class A {
public:   
    enum ENUM { E_A, E_B, E_C, E_D, };
public:
    void Func() {
        ENUM a = E_D;      
    }
};

int main() {
    A::ENUM a = A::E_D;
    return 0;
}

→クラス内ではA::を付けずに使用できる
→クラス外ではA::が必要

ん~なるほど~
復習でした~

拍手[3回]

C++:構造体の初期化方法

C++構造体の初期化方法

構造体の初期化に対するメモです。

●構造体宣言
typedef struct{
    double x;
    double y;
}A;

●変数宣言(初期化)
A a = {
    .x = 1,
    .y = 2
};

※この初期化方法はクラスの宣言内ではできない

.変数名=値
で変数を明示しておけば、プログラムが分かりやすくなりそう。

拍手[0回]

C++:クラスの定数に使用する修飾子constとstatic

C++クラスの定数に使用する修飾子constとstatic

クラスの定数には通常は

static const 型名 変数名

という形で作ってます。
そのstaticとconstは?
どういう意味ってことでメモです。

●static
何個インスタンスを生成しようと、メモリ上にただ1つしか存在しない。
つまり、インスタンス化したクラスごとに変数が存在するのではなく、
全てのクラスで共通の値ということになります。
注意すべきは定数を書き換えられるとやっかいということです。
ということで、constが必要になる。

●const
その変数が書き換えられなくする

ということのようですね。
メモでした。

拍手[0回]

カレンダー

02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

フリーエリア

最新CM

最新TB

プロフィール

HN:
てんねん
性別:
非公開

バーコード

ブログ内検索

P R

カウンター

忍者アナライズ