선언은 C++에서 매개변수 오류를 숨깁니다.

Zeeshan Afridi 2023년10월12일
  1. C++의 액세스 지정자
  2. C++의 Declaration Shadows a Parameter 오류
선언은 C++에서 매개변수 오류를 숨깁니다.

C++의 액세스 지정자에 의해 public, private 또는 protected로 정의된 멤버 함수 또는 데이터 멤버와 같은 다른 클래스 멤버에 액세스하기 위한 모든 개체 또는 변수의 일부 경계, 범위 또는 범위가 항상 있습니다.

프로그램의 특정 범위 또는 블록에서 동일한 이름을 가진 변수를 두 번 이상 정의하면 컴파일러가 혼동을 일으키고 선언이 매개변수를 숨긴다는 오류가 발생합니다.

C++의 액세스 지정자

섀도우 매개변수에 대해 자세히 알아보기 전에 액세스 지정자를 이해하는 것이 중요합니다. 일반적으로 세 가지 액세스 지정자는 public, privateprotected입니다.

C++의 공개 액세스 지정자

Public 지정자는 클래스의 모든 멤버(데이터 멤버 또는 멤버 함수)를 공용으로 만들어 다른 클래스에서 프로그램 전체에 액세스할 수 있습니다. 점 .을 사용하여 해당 멤버 함수에 직접 액세스할 수 있습니다. 동일한 클래스의 개체가 있는 연산자입니다.

#include <iostream>
using namespace std;
// class definition
class Cal_Circle {
 public:  // Public access specifier
  double radius;
  double compute_area() { return 3.14 * radius * radius; }
};

// main function
int main() {
  Cal_Circle obj;
  // accessing public datamember outside class
  obj.radius = 3.4;
  cout << "Radius of the circle is: " << obj.radius << "\n";
  cout << "Area of the circle is: " << obj.compute_area();
  return 0;
}

출력:

Radius of the circle is: 3.4
Area of the circle is: 36.2984

C++의 개인 액세스 지정자

‘Private’ 액세스 지정자는 클래스 경계 내에서 모든 멤버(데이터 멤버 또는 멤버 함수)를 비공개로 유지합니다. 해당 클래스의 개체가 클래스 외부에서 직접 액세스할 수 없습니다.

그들은 프로그램의 보안을 보장하기 위해 클래스 외부의 액세스로부터 숨겨집니다.

#include <iostream>
using namespace std;
// class definition
class Cal_Circle {
 private:  // private access specifier
  double radius;
  double compute_area() { return 3.14 * radius * radius; }
};

// main function
int main() {
  Cal_Circle obj;
  // accessing public datamember outside class
  obj.radius = 3.4;
  cout << "Radius of the circle is: " << obj.radius << "\n";
  cout << "Area of the circle is: " << obj.compute_area();
  return 0;
}

출력:

error: 'double Cal_Circle::radius' is private within this context
   obj.radius = 3.4;
note: declared private here
     double radius;
note: declared private here
     double compute_area(){

이 예제에서 액세스 지정자를 private로 사용하고 기본 함수에서 클래스의 개체를 통해 액세스했습니다. 그리고 여기에서 보호한다고 선언된 각 클래스 구성원에 대해 오류를 발생시킵니다.

C++의 보호 액세스 지정자

마찬가지로 Protected 액세스 지정자는 해당 클래스의 개체를 통해 해당 클래스 외부에서 직접 액세스할 수 없지만 차이점은 Protected 클래스 또는 멤버는 파생 클래스를 통해 액세스할 수 있다는 것입니다.

파생 클래스의 개체를 사용하여 클래스의 보호된 멤버에 액세스할 수 있습니다.

#include <iostream>
using namespace std;

class Radius {  // Base class
 protected:     // protected access specifier
  double radius;
};

class Cal_Circle : public Radius {  // Derive class
 public:                            // private access specifier
  double compute_area(int a) {
    radius = a;
    return 3.14 * radius * radius;
  }
};

// main function
int main() {
  Cal_Circle obj;
  // accessing public datamember outside class
  cout << "Area of the circle is: " << obj.compute_area(3);
  return 0;
}

출력:

Area of the circle is: 28.26

기본 클래스는 보호되고 하나의 데이터 멤버인 radius를 가집니다. 기본 클래스를 Cal_Circle에 상속했으며 파생 클래스의 개체를 사용하여 보호된 데이터 멤버 radius에 액세스합니다.

우리는 보호된 클래스의 보호된 구성원에 간접적으로 액세스하고 있습니다.

C++의 Declaration Shadows a Parameter 오류

컴퓨터 프로그래밍에는 범위라고 하는 특정 경계가 있습니다. 이것은 if-else 블록, 함수 또는 클래스일 수 있습니다.

if-else 블록, 함수 또는 클래스 내부에 정의된 변수는 public으로 정의하지 않는 한 사용할 수 없습니다. 그리고 공용 변수, 함수 또는 클래스는 프로그램 전체에서 액세스할 수 있습니다.

또한 C++에서는 특정 범위 내에서 하나의 변수를 두 번 이상 정의하는 것을 금지합니다. 그리고 이렇게 하면 선언이 매개 변수를 숨김으로 오류가 발생합니다.

예를 통해 이해해 봅시다.

#include <iostream>

int doublenumber();
using namespace std;

int doublenumber(int x) {
  int x;  // We are redefining the same variable as the parameter of the
          // function
  return 2 * x;
  cout << endl;
}

int main() {  // Main function
  int a;
  cout << "Enter the number that you want to double it : " << endl;
  cin >> a;
  int d = doublenumber(a);
  cout << "Double : " << d << endl;
  return 0;
}

출력:

Test.cpp: In function 'int doublenumber(int)':
Test.cpp:6:9: error: declaration of 'int x' shadows a parameter
   int x;

우리가 본 것처럼 함수, 클래스 및 if-else 블록과 같은 특정 코드 블록에서 하나의 변수를 두 번 이상 정의할 수 없습니다.

doublenumber() 함수에는 int x 매개변수가 있고 이 함수의 범위에서 매개변수를 가리고 오류를 발생시키는 또 다른 로컬 int x도 정의합니다.

Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

관련 문장 - C++ Error