コンパイラ: g++ 4.7.2
Ok。.h
そのため、とファイルのデフォルト パラメータについて混乱してい.cpp
ます。多くの場所 (このサイトを含む) で、デフォルトのパラメーターは .h ファイルにのみ追加でき、.cpp ファイルには追加できないことが言及されています。ただし、このコードはそれが間違っていることを証明しています:
test1.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;
}
今、私がテストしたことによると、デフォルトのパラメータを.cpp
ファイルに追加できます。ただし、次の制限があります。
.cpp
とファイルに存在するデフォルトのパラメーター.h
は重複してはなりません。つまりClass(a, b, c=1)
(.h ファイル内) およびClass::Class(a,b,c=2)
(.cpp ファイル内) は無効です。既定のパラメーターが追加されると、その後に宣言されたすべての変数にも既定値が含まれている必要があるというのはよく知られた規則です。これをdefparaルールと呼びましょう。今、
関数宣言 (
.h
ファイル) に記述されている変数は、defpara規則に従う必要があります。つまり、Class(a, b=2, c)
(.h ファイル内) は、.cpp ファイルで宣言されている内容に関係なく無効です。.h
変数がデフォルト値を持っていると考える場合 (およびファイル内のデフォルト値の共通部分として.cpp
)、defparaルールに従います。すなわちClass(a, b, c=1)
(.h ファイル内) およびClass::Class(a,b=2,c)
(.cpp
ファイル内) は有効です。ただし、Class(a, b, c=1)
(.h ファイル内) とClass::Class(a=2,b,c)
(.cpp
ファイル内) は無効です。
だから....私は正しい、間違っている???