21xrx.com
2024-06-03 03:35:40 Monday
登录
文章检索 我的文章 写文章
C++ 删除默认实现
2023-07-07 18:14:46 深夜i     --     --
C++类 默认实现 删除 改写 定制化

C++中,当我们定义一个类的成员函数时,如果没有为该成员函数提供实现,编译器会自动生成默认实现。这个默认实现是一个空实现,仅仅是为了让该函数存在于编译器的符号表中,方便链接器进行链接。但是,在某些情况下,这个默认实现会带来问题,例如:

1. 当我们使用纯虚函数的时候,我们并不希望编译器为该函数生成默认实现。纯虚函数的本意是要求子类必须实现该函数,因此生成默认实现是没有意义的。

2. 当我们使用一些模板技术的时候,编译器会对函数进行重载分辨。如果默认实现存在,会导致函数重载分辨失败,从而编译失败。

针对上述问题,C++11中引入了一种新的语法,可以让我们删除掉默认实现。这个语法就是“= delete”。

通过在函数定义后面加上“= delete”,我们可以删除默认实现。例如:


class Foo {

public:

  Foo() = default;

  Foo(const Foo&) = delete;

  Foo& operator=(const Foo&) = delete;

  ~Foo() = default;

};

上面的代码中,我们删除了复制构造函数和复制赋值函数的默认实现。这样做的好处是,一旦用户试图复制该对象,编译器就会报告错误,从而避免了一些潜在的问题。

除了可以删除复制构造函数和复制赋值函数的默认实现外,我们还可以在其他场合下删除默认实现。例如,我们可以删除默认构造函数、析构函数以及移动构造函数和移动赋值函数的默认实现。

总之,“= delete”语法为我们提供了一种新的工具,可以帮助我们更加精细地控制类的成员函数的实现,从而增强代码的健壮性和可读性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复