4

C++ についてもっと学ぼうとソース コードを調べていると、わかりにくいコードに出会いました。私はそれをいじってその用途を理解することができませんでした。

演算子 float *() の機能とその使用方法を誰かが説明できますか?

クラス ベクトル
{
公衆:
    x、y、z をフロートします。

Vector() : x(0), y(0), z(0){ } Vector( float x, float y, float z ) : x(x), y(y), z(z){ } operator float*(){ return &x; } operator const float *(){ return &x; }

I have searched StackOverflow and it looks like it is a conversion operator but I am still unsure what it actually does and why it is useful.

Kind regards,

4

3 に答える 3

10

operator type_name暗黙の変換演算子を宣言します。つまり、この関数は、型のオブジェクトを (暗黙的に) 変換しようとしているときに呼び出されfloat* ます。たとえば、代入で:

Vector x(1, 2, 3);
float* f = x;
assert(*f == 1);

言うまでもなく、この特定の変換は非常にひどいものです。なぜなら、その効果は非常に直感的ではなく、簡単にバグを見つけることができなくなるからです。暗黙の変換は、混乱を招く可能性のあるセマンティクスを隠しているため、通常は注意して処理する必要があります。しかし、それらは、交換可能に使用されることになっている型でうまく使用でき、変換が問題にならない場合に使用できます。

integerたとえば、独自のcomplexクラスを作成する場合を考えてみましょう。すべての整数は複素数であるため、からintegerへの変換は無害です (ただし、その逆はありません)。したがって、暗黙の変換→を持つことは安全です。complexintegercomplex

于 2014-06-17T10:22:40.303 に答える
6

言われたように、 type のオブジェクトを type のオブジェクトに変換する変換演算子Vectorですfloat *。この変換演算子は、関数指定子がないため、暗黙的に呼び出すことができますexplicit

この演算子を導入したのは、データ メンバー x、y、z を float の配列としてアクセスするためだったと思います。この場合、いくつかの標準アルゴリズムをクラスのオブジェクトに適用して、それを float の配列に変換できます。

2 番目のオーバーロードされた演算子関数には修飾子 const が必要であることを考慮してください。

次のコードを検討してください

#include <iostream>
#include <algorithm>


class Vector
{
public:
    float x,y,z;



    Vector() : x(0), y(0), z(0){
    }

    Vector( float x, float y, float z ) : x(x), y(y), z(z){
    }

    operator float*(){
        return &x;
    }

    operator const float *() const {
        return &x;
    }
};

int main() 
{
    Vector v( 1, 3, 2 );
    auto max = std::max_element( v + 0, v + 3 );
    std::cout << *max << std::endl;

    return 0;
}

出力は 3 です。

C++ 標準に従ってそれを考慮に入れる

13 同じアクセス制御 (第 11 節) を持つ (非共用体) クラスの非静的データ メンバーが割り当てられるため、後のメンバーはクラス オブジェクト内でより高いアドレスを持ちます。

したがって、クラスのデータ メンバーの順序が定義されます。

于 2014-06-17T10:25:29.777 に答える