缺省参数与缺省函数的区别
缺省参数是在函数声明或定义时为函数参数指定的默认值。如果在函数调用时没有为这些参数提供值编译器将自动使用这些默认值。这是通过在参数列表中直接赋值来指定的。以下是一个使用缺省参数的例子cpp void printInfo(const std::string name Unknown, int age -1) { std::cout Name: name , Age: age std::endl; } int main() { printInfo(); // 使用缺省参数输出: Name: Unknown, Age: -1 printInfo(Alice); // 只提供第一个参数输出: Name: Alice, Age: -1 printInfo(Bob, 30); // 提供所有参数输出: Name: Bob, Age: 30 return 0; }缺省函数是编译器在程序员没有显式定义的情况下自动生成的特殊成员函数如构造函数、析构函数、拷贝构造函数、拷贝赋值运算符等。这些函数的生成是为了确保类对象能够进行基本的操作即使没有明确提供相应的函数定义。以下是一个包含缺省函数的例子cpp class MyClass { public: MyClass() {} // 缺省构造函数 MyClass(const MyClass other) {} // 缺省拷贝构造函数 MyClass operator(const MyClass other) { return *this; } // 缺省拷贝赋值运算符 ~MyClass() {} // 缺省析构函数 }; int main() { MyClass obj1; MyClass obj2 obj1; // 使用缺省拷贝构造函数 obj2 obj1; // 使用缺省拷贝赋值运算符 return 0; }在这个例子中即使我们没有显式定义拷贝构造函数和拷贝赋值运算符编译器也会为我们生成缺省的版本。缺省函数都有哪些在C中缺省函数default function指的是编译器在程序员没有显式提供时自动生成的特殊成员函数。这些函数包括缺省构造函数default constructor如果没有为类定义任何构造函数编译器会提供一个不带参数的构造函数这个构造函数会调用基类和成员变量的缺省构造函数如果有的话。析构函数destructor如果类没有定义析构函数编译器会提供一个缺省的析构函数这个析构函数通常是空的除非类有成员需要特殊的清理操作。拷贝构造函数copy constructor如果没有为类定义拷贝构造函数编译器会提供一个缺省的拷贝构造函数它执行成员的逐位拷贝浅拷贝。拷贝赋值运算符copy assignment operator如果程序员没有为类定义拷贝赋值运算符编译器会提供一个缺省的拷贝赋值运算符它执行成员的逐位赋值。移动构造函数move constructor和移动赋值运算符move assignment operatorC11及以后版本在C11中如果程序员没有定义这些函数编译器也会提供缺省的实现。cpp class MyClass { public: MyClass() default; // 显式要求编译器生成缺省构造函数 MyClass(const MyClass other) default; // 显式要求编译器生成拷贝构造函数 MyClass operator(const MyClass other) default; // 显式要求编译器生成拷贝赋值运算符 ~MyClass() default; // 显式要求编译器生成析构函数 private: int value; }; int main() { MyClass obj1; MyClass obj2 obj1; // 使用缺省拷贝构造函数 obj2 obj1; // 使用缺省拷贝赋值运算符 return 0; }提示在上面的代码中 default;告诉编译器生成缺省版本的函数。即使我们不显式要求编译器也会在需要时自动生成这些函数。需要注意的是如果类中定义了任何形式的构造函数包括拷贝构造函数或移动构造函数编译器就不会生成缺省构造函数。同样如果定义了拷贝赋值运算符或移动赋值运算符编译器也不会生成缺省的拷贝赋值运算符。如果需要可以通过显式使用 default;来要求编译器生成这些函数。