名称隐藏在构造函数初始化列表中
Name hiding in constructor initialization list
我想修改构造函数以使用初始化列表,如下例所示:
class Foo
{
public:
Foo(std::wstring bar);
private:
std::wstring bar;
};
// VERSION 1:
Foo::Foo(std::wstring bar) {this->bar = bar}
// VERSION 2:
Foo::Foo(std::wstring bar) : this->bar(bar) {} // ERROR!
不幸的是,我不能执行版本2,因为您不能对数据成员使用this
指针,因为(我猜)它们在那时还不存在。那么,我该如何处理名称隐藏问题(即,我的参数和数据成员的名称相同)?
您不需要。第一个bar
将引用成员,第二个bar
将引用参数:
Foo::Foo(std::wstring bar) : bar(bar) {}
我会更改参数的名称,这样就可以清楚地知道哪个是哪个。
Foo::Foo(std::wstring b) : bar(b) {}
请注意,您不必严格要求,但您代码的未来维护者可能会感谢您。
备用选项:
在C++中,用特殊的命名约定(例如尾部下划线)表示私有成员变量是很常见的。这很好地解决了这个问题:
class Foo
{
public:
Foo(std::wstring bar);
private:
std::wstring bar_;
};
Foo::Foo(std::wstring bar) : bar_(bar) {}
您实际上可以做到这一点:
Foo::Foo(std::wstring bar) : bar(bar) {}
:
之后使用的所有初始值设定项都必须引用基类或某个成员。这意味着您的bar
成员此时不会被隐藏。
编译器会知道该怎么做……只需删除这个->
相关文章:
- C++类 - 初始化列表 - 递归 - 按值传递
- 在初始化列表之外手动调用基类的构造函数
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- std::map与谓词与初始化列表
- 类内初始化与构造函数初始化列表的顺序
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++初始化列表与分配值
- C++初始化列表中的向量集大小或调整大小
- 在构造函数初始化列表中使用 std::variant
- emplace_back初始化列表错误,当初始化列表在独立变量上工作时
- 解释了构造函数成员初始化列表
- 使用初始化列表时如何获取私有数据?
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 如何在成员初始化列表中声明共享指针
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- 我可以检查初始化列表中设置的构造函数主体中的变量吗
- 使用整数初始化列表初始化长双精度的向量
- 是否可以在C++中使用初始化列表设置数组的特定成员?