用いることはできません クラス型のオブジェクトのメンバ関数を用いればクラス型のオブジェクトのメンバ変数に間接的にアクセスすることができます

クラスのメンバ変数にアクセス指定子privateが設定されている場合オブジェクトのメンバ変数同士を足し合わせる普通の自作関数operator+関数を実行することはできません

つづき・・・


マックス


「普通の自作関数operator+の定義を以下のように

👇

Point operator+(Point p, Point q) {


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;

}

👆

設定しているとき


p1+p2;


つまり


operator+(p1,p2);



実行されないときがある・・・・・???


いやん わおん💖🐕💖


先ほどのプログラムを見ても


普通に


クラスPoint型のオブジェクト同士を足し合わせる


p1+p2;


つまり


operator+(p1,p2);



ちゃんと


実行されているじゃないか」


そのプログラムはこちらです

👇



#include <iostream>


using namespace std;


class Point{


public:

int x;

int y;


public:


void pointdisplay();


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";

}



Point operator+(Point p, Point q) {


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;

}


int main() {


Point p1;

p1.x = 1;

p1.y = 1;

p1.pointdisplay();


Point p2;

p2.x = 2;

p2.y = 2;

p2.pointdisplay();


Point p3;

p3=p1+p2;

//🌞p3=operator+(p1,p2);と記述してもOKです🌞


p3.pointdisplay();


return 0;

}


プログラムの実行結果


1

1

2

2

3

3


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   



             あはは

          

            p3=p1+p2;

    🌞p3=operator+(p1,p2);と記述してもOKです🌞


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   


ソーラー「このプログラムでは普通に


           p3=p1+p2;


は実行できています


ところで


今のこのプログラムのクラスPointのクラス宣言


に注目してみてください

👇

#include <iostream>


using namespace std;


class Point{


public://🌞注目ポイントはここです

int x;

int y;



public:


void pointdisplay();


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";

}



Point operator+(Point p, Point q) {


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;

}


int main() {


Point p1;

p1.x = 1;

p1.y = 1;

p1.pointdisplay();


Point p2;

p2.x = 2;

p2.y = 2;

p2.pointdisplay();


Point p3;

p3=p1+p2;

//🌞p3=operator+(p1,p2);と記述してもOKです🌞


p3.pointdisplay();


return 0;

}


プログラムの実行結果


1

1

2

2

3

3


ソーラー「このプログラムの


クラスPointのクラス宣言内で


public:

int x;

int y;


と記述されています


クラスPointのメンバ変数宣言


int x;

int y;


にアクセス指定子


public



設定されています


この


        🐤アクセス指定子publicを


      🐤アクセス指定子privateに書き換えて


private:

int x;

int y;


と記述すると


今のプログラムは


ビルド実行できなくなるんです」


その様子を示すプログラムはこちらです

👇


#include <iostream>


using namespace std;


class Point{


private://👈ここがポイントです

int x;

int y;



public:


void pointdisplay();


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";

}



Point operator+(Point p, Point q) {


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;

}


int main() {


Point p1;

p1.x = 1;

p1.y = 1;

p1.pointdisplay();


Point p2;

p2.x = 2;

p2.y = 2;

p2.pointdisplay();


Point p3;

p3=p1+p2;

//🌞p3=operator+(p1,p2);と記述してもOKです🌞


p3.pointdisplay();


return 0;

}



ビルド実行結果


重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::y" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー (アクティブ) E0265 メンバー "Point::x" (宣言された 行 8) にアクセスできません

エラー C2248 'Point::y': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

エラー C2248 'Point::y': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

エラー C2248 'Point::y': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

エラー C2248 'Point::x': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

エラー C2248 'Point::x': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

エラー C2248 'Point::x': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。



マックス「なんじゃ これはあぁぁ


メンバー "Point::x" (宣言された 行 8) にアクセスできません

メンバー "Point::y" (宣言された 行 9) にアクセスできません


だとぉ


ついでに

エラー C2248 'Point::x': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

エラー C2248 'Point::y': private メンバー (クラス 'Point' で宣言されている) にアクセスできません。

??


なんだ???



ソーラー「どう😊?


プログラムのビルド実行ができなくなるんだよ」


マックス「なんで


public:

int x;

int y;




アクセス指定子publicを

アクセス指定子privateに書き換えて


private:

int x;

int y;


と記述すると


ビルド実行できなくなるんだ?」


ソーラー「それはだいぶん前に学んだように


クラスPointのメンバ変数


int x

int y


のアクセス指定子が


public

ではなく

privateに設定されている場合


main関数内で


p1,p2のクラスPoint型のオブジェクト宣言


Point p1;

Point p2;


を実行して


クラスPoint型のオブジェクトp1

クラスPoint型のオブジェクトp2


を生成しても


生成される

クラスPoint型のオブジェクトp1のメンバ変数p1.x

クラスPoint型のオブジェクトp1のメンバ変数p1.y


クラスPoint型のオブジェクトp2のメンバ変数p2.x

クラスPoint型のオブジェクトp2のメンバ変数p2.y


を直接


         main関数内で


使用することができないからなんです


そのため


プログラム中に


main関数内で


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y


が用いられている箇所があると


ビルドエラーが表示されることになります


ですので


もちろん


p1.x

p1.y


p2.x

p2.y



数値

1

1


2

2


を代入する

p1.x = 1;

p1.y = 1;


p2.x = 2;

p2.y = 2;


を実行することはできません。



さらに


p3=p1+p2;

イコール

p3=operator+(p1,p2);



p1+p2

イコール

operator+(p1,p2)


つまり


「普通の自作関数operator+の定義

👇

Point operator+(Point p, Point q) {


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;

}



Point pにp1

Point qにp2


が代入された


Point a;


a.x = p1.x + p2.x;

a.y = p1.y + p2.y;


return a;


を実行しようとしても


もちろん


クラスPointのメンバ変数


int x

int y


のアクセス指定子は


privateに設定されているので




クラスPoint型のオブジェクトaのメンバ変数

a.x

a.y


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y


を使用することはできず


クラスPoint型のオブジェクトaのメンバ変数

a.x

a.y



クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y

が用いられている今の命令文

👇

Point a;


a.x = p1.x + p2.x;

a.y = p1.y + p2.y;


return a;



を実行しようとすると


ビルドエラーが表示されることになります。」


マックス「つまり


クラスPointのメンバ変数


int x

int y


のアクセス指定子が


privateに設定されている場合


クラスPoint型のオブジェクト宣言


Point p1;

Point p2;

を実行しても


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y


を使用することはできない


さらに


p1+p2;

つまり

operator+(p1,p2);


つまり


Point a;


a.x = p1.x + p2.x;

a.y = p1.y + p2.y;


return a;


を実行することもできないってわけだ


ということは・・・


クラスPointのメンバ変数


int x

int y


のアクセス指定子が


privateに設定されていて



以下のように自作関数operator+関数

👇

Point operator+(Point p, Point q) {


Point a;


a.x = p.x + q.x;

a.y = p.y + q.y;


return a;

}

👆

が定義されている場合


どうやったら

p1+p2;

つまり

operator+(p1,p2);


を実行して


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y


同士を足し合わせることができるんだ


クラスPoint型のオブジェクトaのメンバ変数

a.x

a.y

すら用いることができないんだろう?


とはいっても


p1+p2;

つまり

operator+(p1,p2);


を実行したら


クラスPoint型のオブジェクトaのメンバ変数

a.x

a.y


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y


が登場してくることになるから


ビルドエラーになってしまうではないか


おおぅぅ


そもそも


p1+p2;

つまり

operator+(p1,p2);


を実行して


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y


同士を足し合わせる以前の問題として






クラスPointのメンバ変数


int x

int y


のアクセス指定子が


private


なので


main関数内で


クラスPoint型のオブジェクト宣言


Point p1;

Point p2;

を実行して


クラスPoint型のオブジェクトp1

クラスPoint型のオブジェクトp2


を生成しても



クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y

は使用することができず


クラスPoint型のオブジェクトp1のメンバ変数

p1.x

p1.y


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y


数値データ

1

1


2

2

代入することができないんじゃないか いや~んん😊」




  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る