gpt4 book ai didi

c++ - 如何根据常量和返回类型调用重载函数?

转载 作者:行者123 更新时间:2023-12-05 09:01:54 26 4
gpt4 key购买 nike

这里是菜鸟问题。我注意到一些与我试图在神秘 vector 类中实现的类似的东西:

iterator begin();
const_iterator begin() const;

我试图通过以下实现来实现这一点:

#include <iostream>

class User
{
public:
class A
{
public:
A(){ std::cout << "A constructor" << std::endl; }
};

class B
{
public:
B(){ std::cout << "B constructor" << std::endl;}
};
public:
A begin() { return A(); }
B begin() const { return B(); }
};

int main()
{
User u;

User::A a = u.begin();
User::B b = u.begin();
}

使用这段代码,我可以调用 A 构造函数,但找不到如何调用 B 构造函数的方法。

我收到以下错误消息:

no user-defined conversion from User::A to User::B

我猜,这表明调用了错误的成员函数。

有什么建议吗? :)

最佳答案

在解决问题之前,我将添加一个小注释,以便您理解为什么 C++ 会那样做。

基本上,const那里有函数,因此您可以在访问可变对象实例和不可变对象(immutable对象)实例时公开不同的 API。

因此,例如,您可能已经定义了一个返回 const User 列表的 API。 -s 只允许调用特定的 getter 方法,而不同的 API 将返回单个(非常量)User用于编辑。

编译器会根据您正在使用的实例的常量性自动使用正确的方法。

所以,如果你有一个 const User aUser b , 对于用户 a ,默认值将是 const原型(prototype),并为用户 b , 默认值将是非 const一个,它回落到 const一个如果不存在。

注意:正如 Goswin 正确指出的那样,编译器无法通过返回类型来选择方法,而只能通过检查其参数来选择。 C++ 方法,如附加到类实例的函数,将一个“隐式”指针传递给类实例,称为 this .定义 const 时方法,你基本上是在告诉编译器传递一个 const与非 const 的常规指针相反的指针

正如其他人指出的那样:

  1. 如果您将用户转换为 const一,您可以调用const原型(prototype)。
  2. 或者,如果您定义或返回一个 const User变量,您还将访问 const 原型(prototype)。

有不同的转换方式:

  • C 方式 (const User&)u (你应该避免,但能够识别)
  • 经典const_cast<const User&>(u)
  • C++17 std::as_const(u)

而且你总是可以返回 const如果您只想公开 const,则从方法中引用对象原型(prototype)。

关于c++ - 如何根据常量和返回类型调用重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72592527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com