c++新特性:=default

简介: c++新特性:=default

=default 是C++11引入的一种特性,它允许显式要求编译器生成默认的特殊成员函数。特殊成员函数包括默认构造函数、复制构造函数、移动构造函数、复制赋值运算符、移动赋值运算符以及析构函数。

在默认情况下,如果你没有显式提供这些特殊成员函数的定义,C++编译器会自动生成它们。但是,有时你可能需要明确告诉编译器生成这些函数,这通常在以下情况下很有用:

  • 如果你手动提供了一个类的某个特殊成员函数的定义,但又希望编译器生成其他特殊成员函数,你可以使用=default 来请求编译器生成它们。
  • 在某些情况下,如果你删除了某个特殊成员函数的默认定义(例如,删除了默认构造函数),但后来又需要该函数,可以使用=default 重新启用它。

用法:

#include <iostream>
class MyClass {
public:
    // 默认构造函数被指定为=default,编译器将生成它
    MyClass() = default;
    // 自定义构造函数
    MyClass(int value) : value(value) {}
    void printValue() {
        std::cout << "Value: " << value << std::endl;
    }
private:
    int value = 0;
};
int main() {
    MyClass obj1;      // 使用生成的默认构造函数
    MyClass obj2(42);  // 使用自定义构造函数
    obj1.printValue(); // 输出: Value: 0
    obj2.printValue(); // 输出: Value: 42
    return 0;
}

在这个示例中,MyClass 类中同时定义了一个默认构造函数和一个自定义构造函数。MyClass() 构造函数使用了=default 来指定,所以编译器会自动生成它,而 MyClass(int value) 构造函数是程序员自己定义的。

可以看到 ,在 main 函数中,我们可以创建两个不同的 MyClass 对象,一个使用默认构造函数,另一个使用自定义构造函数。=default 只影响默认构造函数的生成,不影响其他自定义构造函数的使用。这使得可以在需要时组合使用生成的默认特殊成员函数和自己定义的成员函数,以满足类的不同需求。

优点:

  1. 明确性和可读性:=default 明确表明你的意图,即要求编译器生成默认特殊成员函数的定义。这提高了代码的可读性,让其他程序员清楚地知道这些函数是有意生成的,而不是由于遗漏或错误而生成的。
  2. 简化代码:通过使用=default,你可以省去手动编写特殊成员函数的定义,特别是在这些函数只需要默认行为时。这可以减少代码的量,减少了出错的机会。
  3. 遵循C++规则:C++标准要求编译器为每个类生成默认特殊成员函数,如果你不显式提供定义的话。通过使用=default,你可以确保你的类仍然符合这一规则,同时又能够明确控制特殊成员函数的生成。
  4. 更好的安全性和可维护性:当你明确使用=default时,可以减少人为错误,特别是当需要修改特殊成员函数的行为时。如果后来你需要修改这些函数的行为,只需在适当的位置提供自定义的实现即可,而不必修改已有的生成代码。
相关文章
|
2月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
113 59
|
2月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
|
2月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
|
2月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
|
2月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
C++
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
37 0
|
2月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析继承机制(三)
【C++】面向对象编程的三大特性:深入解析继承机制
|
2月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析继承机制(二)
【C++】面向对象编程的三大特性:深入解析继承机制
|
2月前
|
安全 程序员 编译器
【C++】面向对象编程的三大特性:深入解析继承机制(一)
【C++】面向对象编程的三大特性:深入解析继承机制
|
2月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值