C++ 構文エラー: パラメーターが 1 つしかないコンストラクターは明示的に宣言する必要があります。解決方法は?

PHPz
リリース: 2023-08-22 09:01:53
オリジナル
709 人が閲覧しました

C プログラミングでは、次のエラー メッセージが表示される場合があります。パラメーターが 1 つだけあるコンストラクターは、明示的に宣言する必要があります。このエラー メッセージは初心者を混乱させる可能性があります。次に、C の明示的な意味、このエラー メッセージが表示される理由、およびこの問題の解決方法を見てみましょう。

explicit の役割

C では、パラメーターを 1 つだけ受け取るコンストラクターを定義する場合、キーワード Explicit を使用してコンストラクターを明示的に宣言する必要があります。明示的に使用すると、暗黙的な変換の問題を回避し、ある型のオブジェクトが別の型のオブジェクトに暗黙的に変換されるのを防ぐことができます。

たとえば、文字列パラメーターを受け取るコンストラクターがある場合、それが明示的なキーワードを使用して宣言されていない場合、場合によってはコンストラクターが暗黙的に呼び出され、潜在的な問題が発生する可能性があります。以下は、この問題を示す例です。

#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;
}
ログイン後にコピー

上記のコードは、エラーを報告します。パラメーターが 1 つしかないコンストラクターは、明示的に宣言する必要があります。これは、DisplayPerson 関数では、文字列定数をパラメータとして使用して Person 型に渡し、暗黙的な変換が行われるためです。

この問題を解決するには、次のように、コンストラクターの前に明示的なキーワードを追加します。

explicit Person(const std::string& name) : name_(name) { }
ログイン後にコピー

この方法では、Displayperson 関数で文字列定数を直接渡すことはできません。はい、明示的に Person オブジェクトを作成して関数に渡す必要があります。

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

    return 0;
}
ログイン後にコピー

原因と解決策

単一パラメーターのコンストラクターのみ明示的に宣言する必要があります。このエラー メッセージは通常、プログラムで単一パラメーターのコンストラクターが使用されている場合に発生します。これらのコンストラクターを使用する場合は、暗黙的な型変換に依存すべきではありません。暗黙的な型変換により、型の不一致や不安定な動作が発生し、見つけにくいバグが発生する可能性があります。

このエラー メッセージがプログラムで表示される場合は、次の 2 つの方法を使用して解決できます。

方法 1: 明示的なキーワードを使用します。

受信を定義する場合-only 1 パラメーターのコンストラクターの場合、explicit キーワードを使用してコンストラクターを明示的に宣言する必要があります。これにより、暗黙的な型変換が防止され、コードがより安全で理解しやすくなります。

explicit ClassName(Type parameter) {};
ログイン後にコピー

明示的には、単一パラメータのコンストラクターを暗黙的に呼び出すことができないことを指定します。 ClassName はインスタンス化するクラスの名前、Type はパラメータのタイプ、parameter はパラメータの名前です。

以下はサンプルプログラムです。

#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: 型変換関数を使用する

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;
}
ログイン後にコピー

この例では、operator int 関数を使用して Student クラスを整数型に変換します。このアプローチを使用すると、Student オブジェクトを暗黙的に整数型に変換し、display() 関数に渡すことができます。

概要

C の明示的なキーワードを使用すると、コンストラクターを明示的に作成できるため、潜在的な暗黙的な変換によって引き起こされる問題を回避できます。プログラミング中に、「パラメーターが 1 つしかないコンストラクターは明示的に宣言する必要があります」というエラー メッセージが表示された場合は、上記の 2 つの方法を使用してこの問題を解決できます。明示的なコードはより安全でシンプルで、理解と保守が容易であることを覚えておいてください。

以上がC++ 構文エラー: パラメーターが 1 つしかないコンストラクターは明示的に宣言する必要があります。解決方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!