2013-05-25 2 views
0

Как мне сделать так, чтобы значение по умолчанию указывалось переменной, если аргумент не передается конструктору?Как передать переменную значение по умолчанию, если аргумент не передан конструктору? C++

Например:

class A { 

A(int x, int y) 

} 

int main() { 
A(4); 
} 

В этом примере я не прошедший значения у, как бы я сделать это так, у имеет значение по умолчанию, равным 0, например, потому что никаких аргументов, где не поставляется?

ответ

4

аргументы Использовать по умолчанию, с тем ограничением, что параметры могут только иметь значения по умолчанию чтение справа налево, так что недобросовестный x без недобросовестный y не вариант:

A(int x, int y = 0) {} 

Ваш другой выбор должен сделать перегрузку :

A(int x, int y) {} 
A(int x) {/*use 0 instead of y*/} 

Второй может работать особенно хорошо с делегированием конструкторов для более сложных комбинаций:

A(int x, int y) {/*do main work*/} 
A(int x) : A(x, 0) {/*this is run after the other constructor*/} 

Как только вы выполняете какие-либо из этих операций, имейте в виду, что неявные преобразования в ваш класс проще. Вместо единственного возможного {6, 10} вы получили возможность пропускать 5 как A. Подумайте, прежде чем разрешать эти неявные преобразования, и пока вы не узнаете, что хотите их, вставьте explicit перед подписью конструктора, чтобы отключить их.

+0

Как насчет «явного»? –

+0

@CaptainObvlious, зависит от того, желательно ли имплицитное преобразование или нет. В большинстве случаев рекомендуется добавить «явный», и, когда он сомневается, его легче удалить позже, чем добавлять позже. – chris

+0

Я просто думал, что это будет приятное дополнение к ответу;) –

1

Если вы хотите передать значение по умолчанию параметру, вы можете указать его в объявлении конструктора.

class A 
{ 
    A(int x, int y = 0) 
    { 
    } 
}; 

int main() 
{ 
    A(4); 
} 

Будьте внимательны при объявлении аргументов по умолчанию для конструктора. Любой конструктор, который может быть вызван одним аргументом, может вызывать неявное преобразование, если оно не объявлено explicit.

A(int x = 0, int y = 0) // <-- can invoke implicit conversion 
A(int x, int y = 0)  // <-- can invoke implicit conversion 
A(int x, int y)   // <-- does NOT implicit conversion 

Для предотвращения неявного преобразования из встречающихся объявить конструктор как explicit

explicit A(int x = 0, int y = 0) // <-- No longer invokes implicit conversion 
explicit A(int x, int y = 0)  // <-- No longer invokes conversion 
A(int x, int y)     // <-- does not require explicit keyword 
0

Вы должны дать переменный по умолчанию, поэтому конструктор становится

A(int x=5, int y=4) 

} 

Значение по умолчанию у становится 4 и x имеет значение по умолчанию 5

Смежные вопросы