アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++について勉強しています。

http://wisdom.sakura.ne.jp/programming/cpp/cpp13 …

上記のサイトのソースコードで「obj.getX()=10」という場所の意味がよくわかりません。
参照についてはある程度理解できているかと思いますが、初心者にもわかりやすく教えていただけると助かります。

#include <iostream>
using namespace std;

class Kitty{
int X;
public:
int & getX();
} obj ;

int & Kitty::getX() {return X;}

int main() {
obj.getX() = 10;
cout << obj.getX();
return 0;
}

質問者からの補足コメント

  • ありがとうございます

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/07/22 11:31
  • setter/getterの方が開発現場でも多く利用されていますか?

    参照についての理解ですが、ポインタ同様アドレスに対しての操作というふうに理解しています。

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/07/22 11:33

A 回答 (3件)

そもそも class でかつ X を private にしてるってことは, 「X へのアクセスを制限したい」ってことだよね. ところが, getX を public にしたことによって「getX を経由することで X を自由にアクセスできる」ような形になっちゃってる. アクセスを制限したいのか, 自由にアクセスできるようにしたいのか, どっちなんだ?



setter を使えばオブジェクトに対して「値を変更してほしい」と「お願い」する形になる (つまりオブジェクトの自律性がます) から, アクセスを制限したいならこっちが普通. 逆に「メンバーに自由にアクセスさせる」ことが前提なら, 例えば標準ライブラリの std::pair のように struct かつ public にすればそれで済む.

std::vector や std::array では参照を返すメンバー関数もあるけど, これは「組み込みの配列と同じようなアクセス」が目的だし, 内部状態に直接アクセスするわけではないからね.

さておき, 参照は「オブジェクトそのもの」であって, 内部的には
常にデリファレンスされるポインタ
のような扱いになる. このプログラム例だと

#include <iostream>
using namespace std;

class Kitty{
int X;
public:
int *getpX();
} obj ;

int *Kitty::getpX() {return &X;}

int main() {
*obj.getpX() = 10;
cout << *obj.getpX();
return 0;
}

のような感じ. あるいは

#include <iostream>
using namespace std;

class Kitty{
public:
int X;
} obj ;

int main() {
obj.X = 10;
cout << obj.X;
return 0;
}

の方がより直接的かな.
    • good
    • 0
この回答へのお礼

私的には、下のコードの方がすっきりしていて見やすく理解しやすいです。
ありがとうございました。

お礼日時:2020/07/23 03:40

この場合はあんまり適切な使い方とはいえないように思えるなぁ. setter/getter の組を作るか 1つのメンバー関数で両方に対応させるかの選択になるけど, このケースでは setter/getter を作る方が一般的だろう.



ところで, 参照についてはどこまで理解している?
この回答への補足あり
    • good
    • 0

getXはメンバー変数Xの値を返すためだけの関数みたいです。




int hoge=obj.getX();
という右辺での使用法になります。
class の初期化がされないので、
kitty::kitty {
int X=0;
}
Xに値をセットする関数
public int Kitty::setX(int value) {X=value;}
が必要です

&演算子はいらないとかんがえます。
public int getX();
public int Kitty::getX() {return X;}
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2020/07/23 03:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!