C++ でプライベート変数にアクセスする

Anam Javed 2023年10月12日
  1. C++ でプライベート変数にアクセスする
  2. C++ でメンバ関数を使用してプライベート変数にアクセスする
  3. C++ で friend 関数を使ってプライベート変数にアクセスする
  4. C++ でポインタを使用してプライベート変数にアクセスする
  5. まとめ
C++ でプライベート変数にアクセスする

この記事では、C++ プライベート変数と C++ でそれらにアクセスする方法について説明します。

C++ でプライベート変数にアクセスする

カプセル化は、機密性の高い重要なデータを許可されていないユーザーから保護します。private キーワードは、この現象を実現するために使用されます。

カプセル化に加えて、データ非表示の概念も C++ で実装されています。C++ で private キーワードを使用して宣言された変数は、そのクラスのメンバー関数からのみアクセスできることを示します。

オブジェクトや関数は直接アクセスできません。

#include <iostream>
using namespace std;

class shape {
 private:
  double r;

 public:
  void area(double rr) {
    r = rr;

    double ar = 3.14 * r * r;

    cout << "Radius is: " << r << endl;
    cout << "Area is: " << ar;
  }
};

int main() {
  shape obj;
  obj.area(1.5);

  return 0;
}

出力:

Radius is: 1.5
Area is: 7.065

クラスの friend 関数またはメンバ関数以外に、エンティティはクラスのプライベートデータメンバーにアクセスできません。ここで、変数 r は、クラス area() のメンバー関数によってアクセスされます。

area() 関数は、クラスのプライベートデータメンバーにアクセスして、円の面積を計算します。そして、クラスのオブジェクトは、クラスの main 関数で作成されます。

このオブジェクトを介して、クラスメンバー関数にアクセスし、円の面積を計算します。

friend 関数だけでは、プライベートデータメンバーにアクセスする方法ではありません。それに加えて、プライベート変数は、ポインターを使用してクラスの外部でもアクセスされます。

ポインタを使用してプライベートデータメンバーにアクセスするこの方法は、C++ の抜け穴です。それについてもっと学ぶために一緒に読んでください。

C++ でメンバ関数を使用してプライベート変数にアクセスする

C++ のプライベートメンバー変数または関数は、クラスの外部からアクセスしたり表示したりすることはできません。C++ の主な概念は、データのセキュリティという独自の機能です。

プライベートデータメンバーには、それが作成されたクラスとそのクラスの friend 関数によってのみアクセスできます。

以下の例に注目して、クラスのメンバー関数がデータメンバーにアクセスする方法を学習してください。

#include <iostream>
using namespace std;

class Emp {
 private:
  int sal;

 public:
  void setSal(int s) { sal = s; }

  int getSal() { return sal; }
};

int main() {
  Emp myObj;
  myObj.setSal(50000);
  cout << myObj.getSal();
  return 0;
}

出力:

50000

上記のプログラムでは、クラス emp にはプライベートメンバーとパブリックメンバーの両方があります。sal は、setSal()getSal() の 2つのクラスメンバー関数がアクセスできるプライベート変数です。

setSal() はプライベートデータメンバーsal の値を初期化し、getSal() はプライベートデータメンバーsal の値を返します。最後に、main メソッドで、クラスのオブジェクトが作成されます。

オブジェクト myObj は、クラス setSal() のメンバー関数にアクセスして、プライベートデータメンバーsal に値を渡します。最後に、クラスオブジェクトは getSal() にアクセスして sal データメンバーを返します。

デフォルトでは、クラスのすべてのメンバーはプライベートです。たとえば、次のクラスでは、w はプライベートメンバーです。したがって、メンバーにパブリックまたは保護のラベルを付けるまでは、プライベートデータメンバーと見なされます。

class B {
  double w;

 public:
  double len;
  void setW(double wid);
  double get(void);
};

次のプログラムに示すように、リアルタイムでは、データはプライベートエリアで定義され、メンバーはパブリックエリアで機能してクラス外からデータを呼び出します。

#include <iostream>

using namespace std;

class B {
 public:
  double len;
  void setW(double wid);
  double getW(void);

 private:
  double w;
};

double B::getW(void) { return w; }

void B::setW(double wid) { w = wid; }

int main() {
  B box;

  box.len = 10.0;
  cout << "Length: " << box.len << endl;

  box.setW(10.0);
  cout << "Width: " << box.getW() << endl;

  return 0;
}

上記のプログラムでは、クラス B にはプライベートメンバーとパブリックメンバーの両方があります。ここで、w は、2 クラスのメンバー関数がアクセスできるプライベート変数 setW()getW() です。

setW() はプライベートデータメンバーw の値を​​初期化し、getW() はプライベートデータメンバーw の値を​​返します。オブジェクトボックスは、クラスのメンバー関数にアクセスします。

パブリック変数 len は、オブジェクトボックスからアクセスでき、値で初期化されます。setW() は、指定された値をプライベートデータメンバーw に割り当てます。

最後に、クラスオブジェクトボックスは getW() にアクセスして w データメンバーを返します。

出力:

Length: 10
Width: 10

C++ で friend 関数を使ってプライベート変数にアクセスする

friend 関数は、クラスのプライベートまたはパブリック部分にあります。オブジェクトを使用せずに通常のメンバー関数と呼ぶことができます。

クラスオブジェクトは、クラスのスコープ内にないため、それを呼び出しません。さらに、クラスのプライベートおよび保護されたデータメンバーに直接アクセスすることはできません。

friend 関数はクラスのオブジェクトを使用し、ドット演算子を使用してメンバーにアクセスします。グローバル関数または別のクラスのメンバーにすることができます。

#include <iostream>
using namespace std;

class Dist {
 private:
  int m;

  friend int add(Dist);

 public:
  Dist() : m(0) {}
};

int add(Dist d) {
  d.m += 5;
  return d.m;
}

int main() {
  Dist D;
  cout << "Distance: " << add(D);
  return 0;
}

出力:

Distance = 5

上記のプログラムでは、プライベートメンバーm を持つクラス Dist を見ることができます。m の値を初期化するパブリックコンストラクタがあります。

次に、m を使用して距離を計算する friend 関数 add() があります。add() は、クラスのスコープ内にない friend 関数です。

main メソッドでは、クラスのオブジェクトが作成され、add() 関数が渡されます。add() 関数は距離を計算し、結果を表示します。

C++ の friend クラス

friend クラスは、作成できる friend 関数のようなものです。friend クラスは、友達であるクラスの秘密の保護されたメンバーにアクセスできます。

friend 関数と同様に、friend クラスがあります。friend であるプライベートで保護されたクラスメンバーにアクセスできます。

構文:

class X {
  Data members;
  Member Functions;

  friend class Y;
};

class B {
  ……..
};

構文に示されているように、クラス X はクラス Yフレンドです。これは、クラス Y がクラス X のプライベートメンバーと保護されたメンバーにアクセスできることを意味します。

しかし、この友情は相互ではなく、クラス X はクラス Y のプライベートで保護されたメンバーにアクセスできません。クラス X をクラス Yfriend として指定する必要があります。

また、友情は継承されないため、クラス Y はクラス X の子クラスの friend にはなりません。

C++ での friend クラスの例

#include <iostream>
#include <string>
using namespace std;
class Ar {
  int len, br, arr;

 public:
  Ar(int l, int b) {
    len = l;
    br = b;
  };

  void computeArea() { arr = len * br; }

  friend class prClass;
};
class prClass {
 public:
  void prAr(Ar &a) { cout << "Area = " << a.arr; }
};
int main() {
  Ar a(20, 10);
  a.computeArea();
  prClass p;
  p.prAr(a);

  return 0;
}

出力:

Area = 200

上記のプログラムには、2つのクラスがあります。クラス Ar は、len および br 変数を使用して面積を計算します。

このクラスには、arrlen、および br の 3つのプライベートデータメンバーがあります。作成されるもう 1つのクラスは、prClass です。これは、クラス Ar のメンバー関数 computeArea によって計算された最終的な領域を出力します。

すべてのデータメンバーはプライベートであるため、結果を出力するには、prClassAr クラスのフレンドにする必要があります。クラス Ar オブジェクトは、main 関数内に作成されます。

面積の計算が行われ、Ar クラスのオブジェクトが prClass 関数に渡されます。この関数は prAr と呼ばれ、面積を表示します。

friend 関数を使用して C++ のプライベート変数にアクセスすることの短所

C++ の最も重要な機能は、カプセル化、つまりデータと関数のグループ化です。データメンバーとメンバー関数は一緒にデータを処理するため、外部の関数やクラスはデータにアクセスできません。

friend 関数またはクラスが別のクラスのプライベートメンバーにアクセスできるため、カプセル化機能が損なわれます。データセキュリティは危険にさらされます。

C++ でポインタを使用してプライベート変数にアクセスする

ポインタは、フレンドまたはクラスメンバー関数なしでデータにアクセスします。

#include <bits/stdc++.h>
using namespace std;

class Hello {
 private:
  int c;
  int d;
};

int main() {
  Hello a;
  int* q = (int*)&a;
  *q = 4;
  q++;
  *q = 5;
  q--;
  cout << endl << "c = " << *q;
  q++;
  cout << endl << "d = " << *q;
  return 0;
}

出力:

c = 4
d = 5

上記のプログラムでは、a はクラス Hello のオブジェクトです。クラスオブジェクト a アドレスは、型キャストによって整数ポインタ q に割り当てられます。

次に、ポインタ q はプライベートメンバーc を指します。整数値は、c である*q に割り当てられます。

次に、オブジェクト a のアドレスが増加し、メモリ位置にアクセスすることにより、値 5 が d に割り当てられます。q-- ステートメントは、c のメモリ位置を設定します。

cout ステートメントを使用すると、c が表示されます。

まとめ

この記事では、C++ でプライベート変数にアクセスする方法について説明しました。C++ でプライベートメンバーにアクセスするためのさまざまな方法について学びました。

さらに、多くの例を使用して、C++ での friend 関数とポインターの概念について説明しました。重要なことの 1つは、メンバー関数もプライベートであるクラスでオブジェクトを作成できないことです。

このことを念頭に置いて、この記事を楽しんでいただければ幸いです。より有益な記事をお楽しみに。