(Простая концепция конструктора) Почему не Foo (); Делать что-нибудь? - PullRequest
5 голосов
/ 06 декабря 2011

Это простая концепция конструктора C ++, с которой у меня проблемы.

Данный фрагмент кода:

#include <iostream>
using namespace std;

class Foo 
{
public:
    Foo ()      {       cout << "Foo()"  << endl;     }
    ~Foo ()     {       cout << "~Foo()" << endl;     }
};

int main()
{
    Foo f1;
    Foo f2();
}

Вывод был:

Foo()
~Foo()

Кажется, Foo f2(); ничего не делает. Что такое Foo f2(); И , почему ничего не делает?

Ответы [ 2 ]

9 голосов
/ 06 декабря 2011

Foo f2(); объявляет функцию с именем f2, которая не принимает аргументов и возвращает объект типа Foo

Также рассмотрим случай, когда у вас также есть конструктор копирования внутри Foo

Foo (const Foo& obj)     
{     
     cout << "Copy c-tor Foo()"  << endl;    
} 

Если вы попытаетесь написать Foo obj(Foo()), в этом случае вы, вероятно, ожидаете вызова к копирующему c-tor, который будет неправильным.

В этом случае obj будет проанализирован как функция, возвращающая объект Foo и принимающая аргумент типа указатель на функцию. Это также известно как Most Vexing Parse .

Как упомянуто в одном из комментариев Foo obj((Foo())); заставит компилятор анализировать его как выражение (т.е. интерпретировать как объект), а не как функцию из-за дополнительного ().

4 голосов
/ 06 декабря 2011

Вы фактически объявляете f2 как функцию, которая не принимает параметров и возвращает Foo.

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