C++11中的default函数是一种特殊用途的函数,用于显式地声明一个构造函数或析构函数是使用编译器自动生成的。在C++11之前,如果想保留编译器自动生成的构造函数或析构函数,就必须手动将其定义为empty函数体,而C++11的default函数使得这个流程变得更加简单和方便。
1. default构造函数
在C++中,如果一个类没有定义构造函数,编译器会生成一个默认构造函数。但是,如果在类中定义了带参数的构造函数,则默认构造函数将不再生成。如果需要定义默认构造函数,可以使用C++11中的default函数。其使用方法如下:
class MyClass {
public:
int value;
MyClass() = default;
MyClass(int v) { value = v; }
};
在上面的代码中,我们在MyClass的默认构造函数之后加上了=default,这意味着编译器会生成一个默认构造函数。请注意,即使我们在类中声明了其他构造函数,编译器仍会根据需要自动生成默认构造函数。
另外,需要注意的是,default函数只能用于默认构造函数和析构函数。其他类型的函数不能使用default。
2. default析构函数
在C++中,如果一个类没有定义析构函数,编译器会生成一个默认析构函数。但是,如果在类中定义了带参数的析构函数,则默认析构函数将不再生成。如果需要定义默认构造函数,可以使用C++11中的default函数。其使用方法如下:
class MyClass {
public:
int* ptr;
MyClass() { ptr = new int; }
MyClass(int v) { ptr = new int(v); }
~MyClass() = default;
};
在上面的代码中,我们在MyClass的析构函数之前加上了=default,这意味着编译器会生成一个默认析构函数。请注意,即使我们在类中声明了其他析构函数,编译器仍会根据需要自动生成默认析构函数。
总结
使用C++11中的default函数可以简化代码,提高代码的可读性和可维护性。它可以使用户显式地声明使用编译器自动生成的默认构造函数和析构函数,从而避免手动实现这些函数时出现的难以排查的错误。
示例1:使用default构造函数
#include <iostream>
class Person {
public:
std::string name;
int age;
Person() = default;
Person(std::string n, int a) : name(n), age(a) {}
};
int main() {
Person p1; // 使用默认构造函数
Person p2("Tom", 18);
std::cout << "p1: " << p1.name << ", " << p1.age << std::endl;
std::cout << "p2: " << p2.name << ", " << p2.age << std::endl;
return 0;
}
输出:
p1: , 0
p2: Tom, 18
示例2:使用default析构函数
#include <iostream>
class Test {
public:
Test() { std::cout << "Test()" << std::endl; }
Test(const Test& t) { std::cout << "Test(const Test&)" << std::endl; }
~Test() = default;
};
int main() {
Test t1;
Test t2(t1); // 拷贝构造函数
return 0;
}
输出:
Test()
Test(const Test&)
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11中的default函数使用 - Python技术站