Рубрики

Использование явного ключевого слова в C ++

Предсказать вывод следующей программы на C ++.

#include <iostream>

  

using namespace std;

  

class Complex

{

private:

    double real;

    double imag;

  

public:

    // Конструктор по умолчанию

    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

  

    // Метод для сравнения двух комплексных чисел

    bool operator == (Complex rhs) {

       return (real == rhs.real && imag == rhs.imag)? true : false;

    }

};

  

int main()

{

    // Сложный объект

    Complex com1(3.0, 0.0);

  

    if (com1 == 3.0)

       cout << "Same";

    else

       cout << "Not Same";

     return 0;

}

Вывод: программа прекрасно компилируется и выдает следующий вывод.

Same 

Как обсуждалось в этом GFact , в C ++, если у класса есть конструктор, который может быть вызван с одним аргументом, этот конструктор становится конструктором преобразования, потому что такой конструктор позволяет преобразовывать единственный аргумент в конструируемый класс.
Мы можем избежать таких неявных преобразований, поскольку они могут привести к неожиданным результатам. Мы можем сделать конструктор явным с помощью явного ключевого слова . Например, если мы попробуем следующую программу, которая использует явное ключевое слово с конструктором, мы получим ошибку компиляции.

#include <iostream>

  

using namespace std;

  

class Complex

{

private:

    double real;

    double imag;

  

public:

    // Конструктор по умолчанию

    explicit Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

  

    // Метод для сравнения двух комплексных чисел

    bool operator== (Complex rhs) {

       return (real == rhs.real && imag == rhs.imag)? true : false;

    }

};

  

int main()

{

    // Сложный объект

    Complex com1(3.0, 0.0);

  

    if (com1 == 3.0)

       cout << "Same";

    else

       cout << "Not Same";

     return 0;

}

Вывод: ошибка компилятора

no match for 'operator==' in 'com1 == 3.0e+0'

Мы все еще можем типизировать двойные значения для Complex, но теперь мы должны явно типизировать его. Например, следующая программа работает нормально.

#include <iostream>

  

using namespace std;

  

class Complex

{

private:

    double real;

    double imag;

  

public:

    // Конструктор по умолчанию

    explicit Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

  

    // Метод для сравнения двух комплексных чисел

    bool operator== (Complex rhs) {

       return (real == rhs.real && imag == rhs.imag)? true : false;

    }

};

  

int main()

{

    // Сложный объект

    Complex com1(3.0, 0.0);

  

    if (com1 == (Complex)3.0)

       cout << "Same";

    else

       cout << "Not Same";

     return 0;

}

Вывод: программа прекрасно компилируется и выдает следующий вывод.

Same 

Также см. Advanced C ++ | Операторы преобразования

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Использование явного ключевого слова в C ++

0.00 (0%) 0 votes