アクセス指定子がpublicとprivateではどのようにプログラムの実行結果が異なってくるのでしょうか



ソーラー「


まずは次のプログラムをご覧ください

👇


#include <iostream>


using namespace std;


class Cube {


public: //👈🌞ここに注目!!



int no; //変数noはクラスCubeのメンバ変数とよばれます

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます


};


void Cube::display() {


cout << "立方体につけられたナンバーは" << no << "です" << "\n";

cout << "立方体の縦の長さは" << tate << "です" << "\n";

cout << "立方体の横の長さは" << yoko << "です" << "\n";

cout << "立方体の高さの長さは" << takasa << "です" << "\n";


}


//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています


int main() {


Cube cube1;


//👆cube1のクラスCube型のオブジェクト宣言をおこなっています


cube1.no = 1;

cube1.tate = 2.0;

cube1.yoko = 3.0;

cube1.takasa = 4.0;


cube1.display();


return 0;

}


プログラムの実行結果


立方体につけられたナンバーは1です

立方体の縦の長さは2です

立方体の横の長さは3です

立方体の高さの長さは4です



☆  ☆  ☆  ☆  ☆  ☆  ☆


おさらいです


class Cube {


public: // 🌞アクセス指定子publicです


int no; //変数noはクラスCubeのメンバ変数とよばれます

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます


};



class Cube {


public:

int no; //変数noはクラスCubeのメンバ変数とよばれます

public:

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

public:

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

public:

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます

public:

void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます


};


と記述されていることに等しいです


                        solarplexussより

☆  ☆  ☆  ☆  ☆  ☆  ☆










ソーラー「さて みなさ~ん😊



          🐤いよいよ🐤



        🍰アクセス指定子について🍰



考察するときが来ました。


上記のプログラムの


public: //👈🌞ここに注目!!


と記述されている部分に御注目ください。


このpublicはアクセス指定子とよばれています。」



マックス「アクセス指定子?


?アクセスしたいのか?


なんで記述してあるんだ?


いらないんじゃ・・・」



ソーラー「そうなんです


最初は誰もそうおもいマッスル」


マックス「・・・すべっているぞ・・・」


ソーラー「では


ここでアクセス指定子を


publicからprivateにしてみます。


すると


プログラムは以下のようになります。


#include <iostream>


using namespace std;


class Cube {


private: // 🌞アクセス指定子をpublicからprivateに変更しました



int no; //変数noはクラスCubeのメンバ変数とよばれます

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます


};


void Cube::display() {


cout << "立方体につけられたナンバーは" << no << "です" << "\n";

cout << "立方体の縦の長さは" << tate << "です" << "\n";

cout << "立方体の横の長さは" << yoko << "です" << "\n";

cout << "立方体の高さの長さは" << takasa << "です" << "\n";


}


//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています


int main() {


Cube cube1;


//👆cube1のクラスCube型のオブジェクト宣言をおこなっています


cube1.no = 1;

cube1.tate = 2.0;

cube1.yoko = 3.0;

cube1.takasa = 4.0;


cube1.display();


return 0;

}


マックス「


publicからprivateにアクセス指定子が変わったというわけか・・・


地味じゃ~ん


publicの場合とprivateの場合で


なんか違いがあるのか?



ソーラー「あるんです


では このプログラムを実行してみます。


ビルドっと」



プログラムの実行結果


エラー (アクティブ) E0265 関数 "Cube::display" (宣言された 行 19) にアクセスできません

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

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

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

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

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

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

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

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

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


マックス「なんだ? いや~ん💖


なんで


プログラムの実行結果


立方体につけられたナンバーは1です

立方体の縦の長さは2です

立方体の横の長さは3です

立方体の高さの長さは4です


が表示されないんだ?」


てんC「クラス宣言内のアクセス指定子を


publicからprivateに変更したことが関係しているようですね。


いや~んですね。」


ぶーにゃん「にゃお~~ん」


ソーラー「そお~うなんです。


いや~んなんです。


クラス宣言


class Cube {


private: // 🌞アクセス演算子をpublicからprivateに変更しました



int no; //変数noはクラスCubeのメンバ変数とよばれます

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます


};


をよく見てよ。


アクセス指定子privateは


private:


の以下の行の


メンバ変数宣言


int no;

float tate;

float yoko;

float takasa;


メンバ関数宣言


void display();


に作用しているんだ」



マックス「private:


の以下の行の


メンバ変数宣言


int no;

float tate;

float yoko;

float takasa;


メンバ関数宣言


void display();


全部にか・・・」


☆  ☆  ☆  ☆  ☆  ☆  ☆


class Cube {


private: // 🌞アクセス指定子をpublicからprivateに変更しました



int no; //変数noはクラスCubeのメンバ変数とよばれます

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます


};



class Cube {


private:

int no; //変数noはクラスCubeのメンバ変数とよばれます

private:

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

private:

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

private:

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます

private:

void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます


};


と記述されていることに等しいです


                        solarplexussより

☆  ☆  ☆  ☆  ☆  ☆  ☆





ソーラー「以下のように

👇

class Cube {


public: // 🌞アクセス指定子publicが設定されています


int no; //変数noはクラスCubeのメンバ変数とよばれます

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます


};


👆

Cubeのクラス宣言で


          🍋private🍋


でなく


          💖public💖




アクセス指定子に用いられているとします


その場合は          


         💖💖💖main関数内で💖💖💖


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


Cube cube1;



実行すると


オブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

が生成され


オブジェクトcube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa



cube1.no = 1;

cube1.tate = 2.0;

cube1.yoko = 3.0;

cube1.takasa = 4.0;


と数値データを代入することができます


もちろん


cube1.display();


を実行することもできます。」


マックス「それ、いままでやってきたことなんじゃないか??


そりゃ そうだろう。」


ソーラー「ところが


以下のように


Cubeのクラス宣言内で


          💖public💖

          


でなく

          🍋private🍋



        

アクセス指定子に用いられていれば

👇

class Cube {


private: // 🌞👈アクセス指定子privateが設定されています


int no; //変数noはクラスCubeのメンバ変数とよばれます

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます


};

👆



         💖💖💖main関数内で💖💖💖


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


Cube cube1;



実行した場合


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


は生成されていますが


使用することはできません


ですので


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



cube1.no = 1;

cube1.tate = 2.0;

cube1.yoko = 3.0;

cube1.takasa = 4.0;


と数値データを代入することはできません。


オブジェクトcube1のメンバ関数


cube1.display()


も生成されていますが


使用できなくなっているので


オブジェクトcube1のメンバ関数


cube1.display();


を実行することもできなくなります。


つまり


アクセス指定子privateの働きにより


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


オブジェクトcube1のメンバ関数


cube1.display()



使用できなくなるんです。」


てんC「


つまり


クラス宣言内で


private:


を先頭に


メンバ変数宣言

メンバ関数宣言


が記述されていると



             💖💖💖main関数内で💖💖💖


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


Cube cube1;


を実行して


オブジェクトcube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


オブジェクトcube1のメンバ関数


cube1.display()


を作製しても


使用することができなくなっているのですね。」


マックス「なにぃぃぃ ということは


Cubeのクラス宣言


Cube cube1;



実行しても


まったく意味がないってことになるじゃんかい!」



ソーラー「やったね。 マックス!」


マックス「やったぜ ソーラー!」



ぶーにゃん「しあわせだにゃ~ん💖」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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