c++ - 什么是 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);
}
解决方案
Foo(int* ptr) : ptr_{ptr}{}
- 声明并定义类的构造函数
Foo
, - 它接受输入 a
int *
(指向 的指针int
), ptr_
并通过成员初始化器列表初始化成员变量;- 它什么也不做,所以身体是空的,
{}
.
int* ptr_{};
使用一种可能的值初始化语法来进行零初始化 ptr_
;由于它的类型为int*
,它将被初始化为nullptr
,所以这相当于int* ptr_{nullptr};
.
至于他们提出的观点,我认为他们过分强调正常的观察,从而使它看起来像一个特殊的规则:
- 该类有一个名为的成员
ptr_
,它是一个int*
,即指向的指针int
; - 成员函数
set_ptr_val
是const
,因此它承诺不会更改ptr_
或任何其他(非mutable
)成员; - 确实
set_ptr_val
是身体没有变化ptr_
;它修改的是指向的int
. 但没关系。
推荐阅读
- django - 在 self.send 中为 Django Channels 设置变量的目的是什么?
- redis - Redis 复制顺序
- python - pycharm 和 tensorflow-gpu;未找到 DLL
- mysql - “错误代码:2014。命令不同步;您现在无法运行此命令”同时创建触发器
- javascript - 如何将请求的 URL 与自定义 URL 字符串进行比较和验证?
- mysql - 向 mysql json_arrayagg 函数添加条件
- ruby-on-rails - Rails 5.2 无法在生产环境中加载
- python - NameError:名称“train_gen”未定义
- reactjs - 使用带有 react-select v2 的搜索图标
- mysql - HasManyThrough 雄辩的关系,Laravel 5.6、5.7