常量和非常量 getter 具有相同的名称
const and non-const getter with same name
考虑以下类:
class ConstTest
{
public:
ConstTest() : myPrivateData(42) {}
const int* getMyPrivateData() const {std::cout << "const" << std::endl; return &myPrivateData;}
int* getMyPrivateData() {std::cout << "non-const" << std::endl; return &myPrivateData;}
private:
int myPrivateData;
};
是否有任何规则在哪个上下文中使用哪个 getter。我的印象是,只有在常量环境中,常量吸气剂才会被调用。谁能证实这一点?我非常感谢官方来源,因为我想依靠该功能。
编辑:
我知道我可以尝试一下。但是在标准方面我可以依靠它吗?
我可以尝试一下。但是在标准方面我可以依靠它吗?
over.match.funcs/4+5:
对于非静态成员函数,隐式对象参数的类型为
"对 cv X 的左值引用",用于声明没有 ref-qualifier 或 & ref-qualifier 的函数
"对 cv X 的右值引用",用于使用 &&ref-限定符声明的函数
其中 X 是函数所属的类,cv 是成员函数声明的 cv 限定。[ 示例:对于类 X 的 const 成员函数,假定额外参数的类型为"对 const X 的引用"。对于转换函数,该函数被视为隐含对象参数类的成员,目的是定义隐式对象参数的类型。对于由 using-声明引入派生类的非转换函数,该函数被视为派生类的成员,目的是定义隐式对象参数的类型。对于静态成员函数,隐式对象参数被视为匹配任何对象(因为如果选择了该函数,则会丢弃该对象(。[ 注意:没有为静态成员函数的隐式对象参数建立实际类型,也不会尝试确定该参数的转换顺序([over.match.best](。
在重载解析期间,隐含对象参数与其他参数没有区别。但是,隐式对象参数保留其标识,因为无法应用用户定义的转换来实现与其的类型匹配。
没错。因此,如果您有这样的代码:
ConstTest a;
a.getMyPrivateData();
const ConstTest b;
b.getMyPrivateData();
它打印:
non-const
const
这同样适用于其他修饰符,例如volatile
.因此,您的类还可以使用另一种方法来处理volatile
情况:
class ConstTest
{
public:
ConstTest() : myPrivateData(42) {}
const int* getMyPrivateData() const {std::cout << "const" << std::endl; return &myPrivateData;}
int getMyPrivateData() volatile {std::cout << "volatile" << std::endl; return volatilePrivateData;}
int* getMyPrivateData() {std::cout << "non-const" << std::endl; return &myPrivateData;}
private:
int myPrivateData;
volatile int volatilePrivateData;
};
而这段代码:
ConstTest a;
a.getMyPrivateData();
const ConstTest b;
b.getMyPrivateData();
volatile ConstTest c;
c.getMyPrivateData();
指纹:
non-const
const
volatile
您可以自己测试:
#include <iostream>
class ConstTest
{
public:
ConstTest() : myPrivateData(42) {}
const int* getMyPrivateData() const {std::cout << "const" << std::endl; return &myPrivateData;}
int* getMyPrivateData() {std::cout << "non-const" << std::endl; return &myPrivateData;}
private:
int myPrivateData;
};
int main()
{
auto a = ConstTest();
const auto b = ConstTest();
a.getMyPrivateData();
b.getMyPrivateData();
}
设计允许这样做的一个很好的指示是标准库使用它。
例如,请参阅std::vector::data
T* data() noexcept;
const T* data() const noexcept;
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- OpenGL大的3D纹理(>2GB)非常慢
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 使用常量键但非常量值进行映射
- 为什么`is_open()`非常常量
- 从getter方法返回常量和非常量值
- 阻止const类函数在引用成员上调用非常常量类函数
- C++初始化非常大的常量数组,最佳实践
- 提高c++中非常大的常量的可读性