>백엔드 개발 >C++ >C++ 구문 오류: 매개변수가 하나만 있는 생성자는 명시적으로 선언해야 합니다. 해결 방법은 무엇입니까?

C++ 구문 오류: 매개변수가 하나만 있는 생성자는 명시적으로 선언해야 합니다. 해결 방법은 무엇입니까?

PHPz
PHPz원래의
2023-08-22 09:01:53782검색

C++ 프로그래밍에서는 다음과 같은 오류 메시지가 나타날 수 있습니다. 매개 변수가 하나만 있는 생성자는 명시적으로 선언해야 합니다. 이 오류 메시지는 초보자에게 혼란을 줄 수 있습니다. 다음으로 C++에서 명시적이라는 것이 무엇인지, 이 오류 메시지가 나타나는 이유와 이 문제를 해결하는 방법을 살펴보겠습니다.

explicit의 역할

C++에서 하나의 매개변수만 받는 생성자를 정의하는 경우 명시적 키워드를 사용하여 생성자를 명시적으로 선언해야 합니다. 명시적을 사용하면 암시적 변환 문제를 방지하고 한 유형의 개체가 다른 유형의 개체로 암시적으로 변환되는 것을 방지할 수 있습니다.

예를 들어 문자열 매개변수를 받는 생성자가 있는 경우 명시적 키워드를 사용하여 선언하지 않으면 생성자가 암시적으로 호출되어 잠재적인 질문이 발생할 수 있습니다. 다음은 이 문제를 보여주는 예입니다.

#include <iostream>
#include <string>

class Person {
public:
    Person(const std::string& name) : name_(name) { }
    
    std::string GetName() const {
        return name_;
    }

private:
    std::string name_;
};

void DisplayPerson(const Person& p) {
    std::cout << "Person's name is " << p.GetName() << std::endl;
}

int main() {
    // 隐式调用 Person 的构造函数
    DisplayPerson("Tom");

    return 0;
}

위 코드는 오류를 보고합니다. 매개변수가 하나만 있는 생성자는 명시적으로 선언해야 합니다. 이는 DisplayPerson 함수에서 문자열 상수를 매개변수로 사용하여 Person 유형에 전달함으로써 암시적 변환이 발생하기 때문입니다.

이 문제를 해결하려면 다음과 같이 생성자 앞에 명시적 키워드를 추가할 수 있습니다.

explicit Person(const std::string& name) : name_(name) { }

이런 방식으로 DisplayPerson 함수에서는 문자열 상수를 직접 전달할 수 없으며 Person 객체를 생성해야 합니다. 명시적으로 그런 다음 함수를 전달합니다.

int main() {
    // 显式调用 Person 的构造函数
    Person p("Tom");
    DisplayPerson(p);

    return 0;
}

원인 및 해결 방법

단일 매개변수만 있는 생성자는 명시적으로 선언해야 합니다. 이 오류 메시지는 일반적으로 프로그램에서 단일 매개변수 생성자를 사용할 때 발생합니다. 이러한 생성자를 사용할 때 암시적 유형 변환에 의존해서는 안 됩니다. 암시적 유형 변환으로 인해 유형 불일치와 불규칙한 동작이 발생하고 찾기 어려운 버그가 발생할 수 있습니다.

이 오류 메시지가 프로그램에 나타나면 다음 두 가지 방법을 사용하여 문제를 해결할 수 있습니다.

방법 1: 명시적 키워드 사용

하나의 매개변수만 받는 생성자를 정의하는 경우 명시적 키워드를 사용해야 합니다. 키워드 생성자를 명시적으로 선언합니다. 이렇게 하면 암시적 유형 변환이 방지되고 코드가 더 안전하고 이해하기 쉬워집니다.

explicit ClassName(Type parameter) {};

여기서 명시적은 단일 매개변수 생성자를 암시적으로 호출할 수 없음을 지정합니다. ClassName은 인스턴스화하려는 클래스의 이름이고 Type은 매개변수의 유형이며 매개변수는 매개변수의 이름입니다.

다음은 샘플 프로그램입니다.

#include <iostream>
using namespace std;

class Student
{
public:
    explicit Student(int id) { m_id = id; }
    int getId()
    {
        return m_id;
    }

private:
    int m_id;
};

int main(int argc, char** argv)
{
    Student std1(1); // 正确

    Student std2 = 2; // 错误,必须显式声明,不能进行隐式转换

    return 0;
}

방법 2: 유형 변환 기능 사용

두 번째 방법은 유형 변환 기능을 사용하는 것입니다. 명시적을 사용하지 않으려면 클래스를 원하는 유형으로 인스턴스화하는 변환 함수를 정의할 수 있습니다. 이는 한 클래스를 다른 클래스로 변환할 때 일반적으로 사용되는 방법입니다.

다음은 샘플 프로그램입니다.

#include <iostream>
using namespace std;

class Student
{
public:
    Student(int id) { m_id = id; }
    int getId()
    {
        return m_id;
    }
    operator int()
    {
        return m_id;
    }

private:
    int m_id;
};

void display(int id)
{
    cout << "ID: " << id << endl;
}

int main(int argc, char** argv)
{
    Student std(1);

    display(std); // 您可以将 Student 对象转换为所需的类型(int)

    return 0;
}

이 예에서는 연산자 int 함수를 사용하여 Student 클래스를 정수 유형으로 변환합니다. 이 접근 방식을 사용하면 Student 객체를 암시적으로 정수 유형으로 변환하고 display() 함수에 전달할 수 있습니다.

요약

C++의 명시적 키워드를 사용하면 생성자를 명시적으로 생성할 수 있으므로 잠재적인 암시적 변환으로 인해 발생하는 문제를 피할 수 있습니다. 프로그래밍 중에 "단일 매개변수만 있는 생성자는 명시적으로 선언해야 합니다"라는 오류 메시지가 표시되는 경우 위의 두 가지 방법을 사용하여 이 문제를 해결할 수 있습니다. 명시적 코드는 더 안전하고 간단하며 이해 및 유지 관리가 더 쉽다는 점을 기억하세요.

위 내용은 C++ 구문 오류: 매개변수가 하나만 있는 생성자는 명시적으로 선언해야 합니다. 해결 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.