首页 > 解决方案 > 什么是 Foo(int* ptr): ptr_{ptr}{}?

问题描述

我在 Bjorn Andrist 和 Viktor Sehr 的“C++ High Performance”一书中看到了这段代码。该代码示例实际上用于显示“尽管声明了函数但仍编译const!”这一点,我知道这一点。int* ptr_{};但是,Foo(int* ptr):ptr_{ptr}{}在此之前,我还没有看到。这两段代码在做什么,特别是Foo(int* ptr):ptr_{ptr}{}?用作示例的整个代码片段是这样的:

class Foo {
public:
    Foo(int* ptr):ptr_{ptr}{}
    auto set_ptr_val(int v) const {
        *ptr_ = v; // Compiles despite function being declared const!
    }

private:
    int* ptr_{};
};

int main(){
    auto i = 0;
    const auto foo = Foo{&i};
    foo.set_ptr_val(42);
}

标签: c++

解决方案


Foo(int* ptr) : ptr_{ptr}{}
  • 声明并定义类的构造函数Foo
  • 它接受输入 a int *(指向 的指针int),
  • ptr_并通过成员初始化器列表初始化成员变量;
  • 它什么也不做,所以身体是空的,{}.

int* ptr_{};

使用一种可能的值初始化语法来进行零初始化 ptr_;由于它的类型为int*,它将被初始化为nullptr,所以这相当于int* ptr_{nullptr};.


至于他们提出的观点,我认为他们过分强调正常的观察,从而使它看起来像一个特殊的规则:

  • 该类有一个名为的成员ptr_,它是一个int*,即指向的指针int
  • 成员函数set_ptr_valconst,因此它承诺不会更改ptr_或任何其他(非mutable)成员;
  • 确实set_ptr_val是身体没有变化ptr_;它修改的是指向的int. 但没关系。

推荐阅读