當類別未聲明時,編譯器會隱式宣告並視需要定義:
ClassName()ClassName(const ClassName&)ClassName& operator=(const ClassName&)~ClassName()class NameObject {
std::string nameValue;
int objectValue;
public:
NameObject(const char* n, int v) : nameValue(n), objectValue(v) {}
};
NameObject no1("Smallest Prime Number", 2);
NameObject no2(no1); // 複製建構
// 相當於:
// no2.nameValue = no1.nameValue; // 呼叫 string 複製建構
// no2.objectValue = no1.objectValue; // 逐位元複製 int
當類別包含 reference 成員 或 const 成員 時,編譯器無法產生複製指派運算子(複製建構函式仍可產生,但指派會失敗):
class NameObject {
std::string& nameValue; // reference 成員
const int objectValue; // const 成員
public:
NameObject(std::string& n, int v) : nameValue(n), objectValue(v) {}
};
int main() {
std::string a("A"), b("B");
NameObject obj1(a, 1), obj2(b, 2);
obj1 = obj2; // 編譯錯誤:無法重新繫結 reference、無法修改 const
}
= delete 拒絕)。編譯器隱式產生的函式行為是「逐成員複製/銷毀」。理解其運作機制與限制(reference/const 成員),才能決定是否需要自行實作或拒絕。