c++ - 重载类本身

标签 c++ class operator-overloading

假设我有一个类:

class foo
{
    ....
    //some constructors here set val=34
    ....
    private:
    int val;
    int & foo::operator,()
    {
      return val;
    }
};

我希望能够将它用作:

foo bar;
printf("  %d ", bar);   //i need to get value of bar.val
                        //with just using bar itself with
                        //using an overloading
                        //but , overloading does not work
                        //i need to get 34 without using bar.val
                        //i need this without any getter 
                        //i need val to be private

问题:这种重载是否可能?如果是,如何?

我试过:

int foo::operator int()
{
    return val;
}

但它说“返回类型可能未在转换函数上指定”:(

我试过:

operator int() const { return val; } 

转换仅在 printf 和 cout 之外有效。

 int e=foo;
 printf(" %d ",e); //works 

最佳答案

你不能重载一个类,但你可以使用一个转换运算符,这样它就会根据上下文中的预期参数自动转换为不同的类型。在您的情况下,为 val是一个 int ,您会将转换过载到 int像这样:

operator int() const { return val; }

现在无论int是必需的,您提供一个 foo , 应用此转换。

有一些限制。例如,如果您传递 foo到相应参数类型为泛型的函数模板,在那个地方不会有任何转换。转换也不会影响其他不强制类型的表达式。例如,如果 f类型是 foo , 然后 &f将始终为 foo* 类型, 不是 int* .对于大多数实际应用,这一切正是您所需要的。但我相信 C 风格的可变参数 printf正是这样一种情况,没有明确定义的预期类型。最好使用 C++ 风格的调用,或显式转换 static_cast<int>(f) .

如果两者都不适合您,那么您就有麻烦了:C++ 逻辑无法推断出您需要 int 的事实。在这里,仅仅因为你包含了一个 %d在一些字符串常量中。类型转换是编译时的事情,而格式字符串的解释是在运行时完成的(除非像 gcc 那样生成警告)。编译器不知道该参数需要是什么类型,因此它不知道要执行什么转换,因此您必须以某种方式帮助他。

只要这个int valfoo的唯一成员,而且在这个类中也没有虚函数,也没有带有任何数据成员的基类或 virtula 函数,类对象的内存布局 foo通常与普通整数相同。这意味着未类型化的 C 风格 printf将无法区分,即使根本没有任何转换。但是依赖这个是非常糟糕的风格,所以我建议不要使用它。

关于c++ - 重载类本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334647/

相关文章:

c# - 合并基类和派生 C# 类的工具

c++ - 为模板类重载友元运算符<<

c++ - 在这种情况下,运算符应该 == 还是 != 抛出?

c++ - 混合 C 和 C++ 时不断出现 LNK2019 错误

Java,类中的For循环

c++ - 使用声明和 const 重载

Delphi 'in' 集合上的运算符重载

c++ - 在 C++ 中分配一个结构

c++ - std::find 在一个 (unordered_map

Java-使用构造函数来放置方法的值?