parámetros predeterminados en archivos .h y .cpp

COMPILADOR: g ++ 4.7.2

De acuerdo. Así que estoy confundido acerca de los parámetros por defecto en.h y.cpp archivos. En muchos lugares (incluido este sitio) se menciona que los parámetros predeterminados se pueden agregar solo en archivos .h y no en archivos .cpp. Sin embargo, este código prueba que es incorrecto:

prueba1.h

#pragma once

#include <iostream>
using namespace std;

class Class{
public:
    Class(int, int, int=1);
};

test1.cpp

#include "test1.h"

Class::Class(int a, int b=2, int c)
{
    cout<<a<<" "<<b<<" "<<c<<endl;
}

int main()
{
    Class a(1);
    return 0;
}

Ahora, de acuerdo con lo que he probado, los parámetros predeterminados se pueden agregar a.cpp archivos. Sin embargo, las siguientes restricciones se mantienen:

Los parámetros por defecto presentes en.cpp y.h archivo no debe superponerse. es decirClass(a, b, c=1) (en archivo .h) yClass::Class(a,b,c=2)(en el archivo .cpp) no es válido.

Es una regla bien conocida que, una vez que se han agregado los parámetros predeterminados, todas las variables declaradas después también deben contener valores predeterminados. Llamemos a esto elDefpara regla. Ahora,

Las variables indicadas en la declaración de función (.h archivo) debe obedecer elDefpara regla es decirClass(a, b=2, c) (en el archivo .h) no es válido independientemente de lo que se declara en el archivo .cpp.

Si uno considera que las variables tienen valores predeterminados (como una intersección de valores predeterminados en.h y.cpp archivos), seguiría elDefpara regla. es decirClass(a, b, c=1) (en archivo .h) yClass::Class(a,b=2,c)(en.cpp archivo) es válido. PeroClass(a, b, c=1) (en archivo .h) yClass::Class(a=2,b,c)(en.cpp archivo) no es válido.

Así que ... estoy en lo cierto, ¿no?

Respuestas a la pregunta(4)

Su respuesta a la pregunta