🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
クラスのメンバ変数にアクセス指定子privateが設定されている場合オブジェクトのメンバ変数同士を足し合わせる普通の自作関数operator+関数を実行することはできません
用いることはできません クラス型のオブジェクトのメンバ関数を用いればクラス型のオブジェクトのメンバ変数に間接的にアクセスすることができます
クラスのメンバ変数にアクセス指定子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
を
代入することができないんじゃないか いや~んん😊」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます