Я нашел какой-то странный код ...

//in file ClassA.h:
class ClassA {
public:
    void Enable( bool enable );
};

//in file ClassA.cpp
#include <ClassA.h>
void ClassA::Enable( bool enable = true )
{
   //implementation is irrelevant
}

//in Consumer.cpp
#include <ClassA.h>
....
ClassA classA;
classA.Enable( true );

Очевидно, поскольку Consumer.cpp включает только ClassA.h, а не ClassA.cpp, компилятор не сможет увидеть, что параметр имеет значение по умолчанию.

Когда будет иметь эффект объявленное значение по умолчанию ClassA::Enable в сигнатуре реализации метода? Произойдет ли это только при вызове метода из файлов, содержащих ClassA.cpp?

8
sharptooth 17 Июл 2009 в 13:16

4 ответа

Лучший ответ

Значения по умолчанию - это просто время компиляции. В скомпилированном коде нет такого понятия, как значение по умолчанию (нет метаданных и тому подобного). По сути, это замена компилятора выражению «если вы ничего не пишете, я вам это укажу». Итак, если компилятор не видит значение по умолчанию, он предполагает, что его нет .

Демо:

// test.h
class Test { public: int testing(int input); };

// main.cpp
#include <iostream>
// removing the default value here will cause an error in the call in `main`:
class Test { public: int testing(int input = 42); };
int f();
int main() {
   Test t;
   std::cout << t.testing()  // 42
             << " " << f()   // 1000
             << std::endl;
   return 0;
}

// test.cpp
#include "test.h"
int Test::testing(int input = 1000) { return input; }
int f() { Test t; return t.testing(); }

Контрольная работа:

g++ main.cpp test.cpp
./a.out
11
mmx 17 Июл 2009 в 09:48

В объявлении укажите значение по умолчанию, а не определение.

class ClassA {
public:
    void Enable( bool enable = true );
};
0
Sam Harwell 17 Июл 2009 в 09:19

Произойдет ли это только при вызове метода из файлов, содержащих ClassA.cpp?

Это правильно. Но обратите внимание, что это почти наверняка приведет к множественным ошибкам определения, поэтому значение по умолчанию действительно доступно только с точки его определения в ClassA.cpp.

1
anonanon 17 Июл 2009 в 09:19

Прежде всего, позвольте мне признать, что я впервые вижу этот тип кода. Ввод значения по умолчанию в файл заголовка ЯВЛЯЕТСЯ нормальной практикой, но это не так.

Я предполагаю, что это значение по умолчанию может использоваться только из кода, написанного в том же файле, и таким образом программист, который это написал, хотел упростить его вызов функции, но он не хотел мешать интерфейсу ( заголовочный файл), видимый для внешнего мира.

3
Aamir 17 Июл 2009 в 09:22