конструктор с одним аргументом по умолчанию - PullRequest
1 голос
/ 19 марта 2011

Я искал, но не смог найти ответ.

Итак, у меня есть мой конструктор c ++:

MyClass(string username = "something");

Обратите внимание, что это единственный конструктор, который у меня есть.

вмое главное, я делаю:

MyClass one();
MyClass two = MyClass();

эквивалентны ли эти два выражения?будет ли компилятор вызывать мой конструктор со строкой по умолчанию или он будет вызывать конструктор по умолчанию (пустой)?

Что изменится, если у меня будет конструктор MyClass ();?Я думаю, что не будет компилироваться, верно?

Ответы [ 5 ]

3 голосов
/ 19 марта 2011

MyClass one();

Здесь объявляется функция one, возвращающая объект MyClass и не принимающая аргументов.

Если у вас есть и конструктор по умолчанию (в форме MyClass()), и конструктор аргументов по умолчанию (в форме MyClass(string s = "string")), какой из них будет вызван, если вы не передадите какой-либо аргумент?

Например, это не скомпилирует

class MyClass
{
  public:
   MyClass(std::string username = "something") {}
   MyClass(){}
};

int main()
{
   MyClass one();
   MyClass two = MyClass(); //ambiguous call here
}
2 голосов
/ 19 марта 2011
MyClass one;
MyClass two = MyClass();

Если это то, что имелось в виду, тогда one и two будут вызывать один и тот же конструктор, который является вашим конструктором, который оказывается единственным конструктором.

0 голосов
/ 16 апреля 2019

эквивалентны ли эти два выражения?

Они не эквивалентны.

MyClass one ();

это функция one (), возвращает MyClass.

если вы хотите объявить объект MyClass, он должен быть:

MyClass один;

или

MyClass one = MyClass ();

на вопрос:

компилятор будет вызывать мой конструктор со строкой по умолчанию, или это будет вызывать конструктор по умолчанию (пустой)?

если вы объявите свой собственный конструктор, компилятор никогда не сгенерирует конструктор по умолчанию, тогда конструктор по умолчанию не существует например:

MyClass(string username); // declare constructor take 1 parameter
MyClass three; // error, no matching constructor
0 голосов
/ 19 марта 2011

Выражения будут иметь тот же эффект nett, но они не являются строго эквивалентными.Первый вызывает ваш конструктор на one.Второй создает временный объект, а затем присваивает его two, вызывая таким образом конструктор копирования класса.

0 голосов
/ 19 марта 2011

Это вызовет ваш конструктор.Если вы определяете конструктор самостоятельно - любой конструктор независимо от количества аргументов - компилятор не будет генерировать конструктор по умолчанию.

[править] Как говорит Прасун Саурав, MyClass one();объявляет функцию.Вы хотите MyClass one;, примечание: без скобок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...