LINUX.ORG.RU

[C++] explicit-конструкторы

 


0

1

Приветствую всех.

Возник следующий вопрос:

В С++ с помощью ключевого слова explicit можно запретить неявное преобразование аргумента конструктора. Т.е.

class A
{
   int x;
public:
   explicit A(int d)
   {
      x = d;
   }
};

int main()
{
   A a1(5);   // так можно
   A a2 = 5;  // ошибка
   return 0;
}

Собственно вопрос: чем может быть опасно неявное преобразование аргумента конструктору. Может быть кто-нибудь сталкивался с этим на практике?



Последнее исправление: Lorchanko (всего исправлений: 2)

В любой книжке по C++ есть масса примеров.

anonymous
()

Если твой единственный параметр имеет какой-то свой смысл, т.е. если Vector(n) создаёт, к примеру, вектор из n элементов, то было бы очень не хорошо, если бы компилятор Vector b(6); Vector a = 5 * b; трактовал как умножение вектора на вектор.

Yareg ★★★
()
Ответ на: комментарий от kyz

> например, что-бы размер вектора нельзя было задать символом.

std::vector v('a'); // OK

anonymous
()
#include <iostream>

class base
{
  public:
    base(int i): i(i) {}

    int get_i() const { return i; }

  protected:
    int i;
};

class derived: public base
{
  public:
    derived():
      base(0)
    {}

    derived(const base *b):
      base(b->get_i())
    {}

    derived(const derived &d):
      base(d.i)
    {}

    void say_hello() const { std::cout << "hello" << std::endl; }
};

void f(const derived &d)
{
  d.say_hello();
}

int main()
{
  derived d;
  f(d);  // эта строка компилируется, ожидаемо
  f(&d); // а эта почему компилируется?
}
bvvv
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.