Существует хороший способ, если вы используете validate()
с параметрами в форме и хотите вручную подтвердить одно поле вашей формы:
var validationManager = $('.myForm').validate(myParameters);
...
validationManager.element($(this));
Документация: Validator.element ( )
Определение для конструктора преобразования отличается от C ++ 03 и C ++ 11. В обоих случаях он должен быть конструктором не explicit
(иначе он не будет задействован в неявных преобразованиях), но для C ++ 03 он также должен быть вызван с помощью одного аргумента. То есть:
struct foo
{
foo(int x); // 1
foo(char* s, int x = 0); // 2
foo(float f, int x); // 3
explicit foo(char x); // 4
};
Конструкторы 1 и 2 оба являются конструкторами преобразования в C ++ 03 и C ++ 11. Конструктор 3, который должен принимать два аргумента, является только конструктором преобразования в C ++ 11. Последний конструктор 4 не является конструктором преобразования, потому что он explicit
.
explicit
, который может быть вызван одним параметром, указывает преобразование из типа его первого параметра в тип его класса. Такой конструктор называется конструктором преобразования. explicit
, указывает преобразование из типов его параметров в тип своего класса. Такой конструктор называется конструктором преобразования. Почему конструкторы с более чем одним параметром считаются преобразователями в C ++ 11? Это связано с тем, что новый стандарт предоставляет нам удобный синтаксис для передачи аргументов и возврата значений с помощью braced-init-lists . Рассмотрим следующий пример:
foo bar(foo f)
{
return {1.0f, 5};
}
Способность указывать возвращаемое значение как braced-init-list считается преобразованием. Для этого используется конструктор преобразования для foo
, который принимает float
и int
. Кроме того, эту функцию можно вызвать, выполнив bar({2.5f, 10})
. Это также конверсия. Поскольку они являются преобразованиями, для конструкторов, которые они используют, являются конструкторами преобразования .
. Важно отметить, что, делая конструктор foo
, который принимает a float
и int
имеют спецификатор функции explicit
, чтобы остановить компиляцию вышеуказанного кода. Вышеупомянутый новый синтаксис может использоваться только в том случае, если для выполнения задания имеется конструктор преобразования.
return
с braced-init-list инициализирует объект или ссылку, которая должна быть возвращена из функции путем инициализации-list-initialization (8.5.4) из указанного списка инициализаторов. §8.5: Инициализация, возникающая [...] при передаче аргументов [...], называется копией-инициализацией. §12.3.1: Явный конструктор строит объекты так же, как и неявные конструкторы, но делает это только там, где явно используется синтаксис прямой инициализации (8.5) или где используются броски (5.2.9, 5.4). Преобразование неявно с помощью конструктора преобразования
Давайте сделаем пример в вопросе более сложным
class MyClass
{
public:
int a, b;
MyClass( int i ) {}
MyClass( const char* n, int k = 0 ) {}
MyClass( MyClass& obj ) {}
}
Первые два конструктора преобразуют конструкторы. Третий - это конструктор копирования и, как таковой, является другим конструктором преобразования.
Конструктор преобразования допускает неявное преобразование из типа аргумента в тип конструктора. Здесь первый конструктор позволяет преобразовать из int
в объект класса MyClass
. Второй конструктор позволяет преобразовать из строки в объект класса MyClass
. И третий ... из объекта класса MyClass
в объект класса MyClass
!
Чтобы быть конструктором преобразования, конструктор должен иметь один аргумент (во втором, второй аргумент имеет один значение по умолчанию) и объявляется без ключевого слова explicit
.
Затем инициализация в основном может выглядеть так:
int main()
{
MyClass M = 1 ;
// which is an alternative to
MyClass M = MyClass(1) ;
MyClass M = "super" ;
// which is an alternative to
MyClass M = MyClass("super", 0) ;
// or
MyClass M = MyClass("super") ;
}
Явное ключевое слово и конструкторы
Теперь, что, если бы мы использовали ключевое слово explicit
?
class MyClass
{
public:
int a, b;
explicit MyClass( int i ) {}
}
Тогда компилятор не принял
int main()
{
MyClass M = 1 ;
}
, поскольку это неявное преобразование. Вместо этого нужно написать ключевое слово
int main()
{
MyClass M(1) ;
MyClass M = MyClass(1) ;
MyClass* M = new MyClass(1) ;
MyClass M = (MyClass)1;
MyClass M = static_cast<MyClass>(1);
}
explicit
, которое всегда должно использоваться для предотвращения неявного преобразования для конструктора, и оно применяется к конструктору в объявлении класса.