65375


C++初心者です。このコードのRect()の中でconstにするのは初期化によってtopやleftの値を変えられないようにするためでしょうか？また、参照渡しならfloat
&topにするべきなのではないのですか？それともfloat& topは参照渡しではなく他の何かを意味するのでしょうか。教えてください。

[code]

    class Rect{
        public:
            Rect(const float& top,const float& left,const float& bottom,const float& right){a = top; b = left; c = bottom; d = right;}
            void member(){std::cout << a << b << c << d << std::endl;};
            float getArea();
            ~Rect(){}
        private:
            float a, b, c, d;
    };
    
[/code]


CC BY-SA 4.0
2020-04-05T15:04:49.053
65374
2021-11-29T00:31:13.540
2020-04-06T00:21:09.263
3060
39446
question
c++
constと参照渡し（？）の使い方


参照が型として使えるC++で「参照渡し」と言う言い方が適当かどうかは疑問なんですが、特に概念的に全く異なったものを表しているわけではないので、まぁありかなと言うことにしておきます。

**_初期化によってtopやleftの値を変えられないようにするためでしょうか？_**

「変えられないようにする」と言うよりは、「このコンストラクターはパラメータを参照で受け取るけど、値は変更しませんよ」と宣言しているわけです。もちろん「変更しませんよ」と言っているのに値を変更しようとすればコンパイラがエラーとして検出しますから、「変えられないようにする」と言う見方も間違いではありません。

**_参照渡しならfloat &topにするべきなのではないのですか？それともfloat& topは参照渡しではなく他の何かを意味するのでしょうか。_**

ポインタ型を宣言する場合、`float *pTop`と書いても、`float*
pTop`と書いても良いのは理解されているでしょうか?参照を表す`&`もポインタを表す`*`と同様の文法で解析されます。

C++言語では一般的に識別子と記号の間には任意個の空白文字を置けるので、なんなら`float &
top`なんて書き方をしたって構いません。特定の空白の置き方をしたときだけ「参照渡し」になるわけではありません。


CC BY-SA 4.0
2020-04-05T15:32:32.777
65375
2020-04-05T15:32:32.777
13972
65374
answer


先人の回答者の方！C++もちゃんと勉強して！！  
C++は右辺値参照と左辺値参照っていう概念があるんですが、  
参照って変数に対してしか使えないんですよ。

[code]

    int a = 1;
    int& b = a;
    int& c = 2; //できない
    // これが左辺値参照で、
    int&& c = 2;
    // これは動きます、これが右辺値参照です
    
[/code]

右辺値参照は逆に変数には使えません。  
右辺値は普通なら代入できない値のことで、関数の返り値や一時オブジェクトのことです。

[code]

    f() = 1;
    1 = 2;
    std::string() = "abc";
    
[/code]

のような値ですね。  
でも右辺値も左辺値も参照として取り出したいことあるじゃないですか。

[code]

    struct MyClass{
       std::string str;
       MyClass(String _str):str(_str){}
    }
    
[/code]

でもこれだと使うときに、引数にコピーと、引数からメンバーにコピーで2回コピー処理が入る。  
だけど引数を参照にすれば、引数からメンバーのコピーで一回で済むでも引数を参照にすると

[code]

    std::string str = "aiu";
    MyClass(str);// 出来る ①
    
    MyClass("aiu");// できない ②
    
[/code]

で使いにくいじゃないですか、逆にMyClassのコンストラクタの引数を右辺値参照にすると、②はできるけど①はできなくなる。

こういうときに本題のconst Type&が出てきます。  
値の変更はできないけど、右辺値でも左辺値でも参照として持ってこれる！！  
MyClassならどんな状況でもコピーが一回で済む！  
これがconst Type&です！！

ですが参照は機械上の動きではポインタと同じように扱われます、ということはポインタが64bitCPUなら基本的に64bitのサイズを持ち、参照渡しとして引数で渡されるポインタよりもfloatの32bitの方が小さいので普通にコピーのコンストラクタでいいと思います。  
最適化でもしかしたら参照のほうが早くなったりするかもしれませんが。


CC BY-SA 4.0
2021-11-28T10:27:18.303
83843
2021-11-29T00:31:13.540
2021-11-29T00:31:13.540
3060
48869
65374
answer