如何创建可以初始化C ++数据类型的类?

时间:2011-07-27 04:38:59

标签: c++ overloading operator-keyword friend assignment-operator

标题基本上都说明了一切。我主要想这样做,这样我就可以创建一个对象(比如一个自定义字符串对象),可以初始化其他API中其他函数的参数。以下是我尝试使用自定义整数类的示例:

#include <iostream>
using namespace std;

class test
{
public:
    int member;
    test(int i) : member(i) {}

    friend int &operator=(int &i, test t);
};

int &operator=(int &i, test t)
{
   return (i = t.member);
}

int main()
{
    int i;
    test t = 90;

    cout << (i = t);
    return 0;
}

不幸的是我收到一条错误,说operator =需要是一个成员函数。我理解C ++标准的目标是防止赋值运算符的静态和非成员重载被实现,但有没有其他方法可以做到这一点?感谢您的任何帮助/建议!

4 个答案:

答案 0 :(得分:5)

这不是通过赋值运算符完成的,而是使用重载的类型转换。这将使您的主要功能像预期的那样工作:

#include <iostream>
using namespace std;

class test
{
public:
    int member;
    test(int i) : member(i) {}
    operator int() const {return member;}
};

int main()
{
    int i;
    test t = 90;

    cout << (i = t);
    return 0;
}

答案 1 :(得分:3)

您要做的事情需要转换运算符

operator int() 
{
    return this->member;
}

对于您尝试编写的类(仅包含整数成员),需要重载=运算符。

=运算符是编译器默认为每个类生成的成员函数之一。需要注意的是,它会对类成员进行简单的逐位复制(浅拷贝),因为你只有整数,它应该足够好。

如果您已将动态分配的指针作为成员函数,则需要重载=运算符,因为在这种情况下,这些指针的浅表副本将导致包含指向同一动态的成员指针的所有对象记忆位置&amp;如果其中一个对象完成了它的生命周期,则其他对象会留下一个悬空指针 正如@Tony,恰当地指出评论浅版本通常不好但并不总是。请参阅他对场景的评论。

如果你想重载赋值运算符,请查看 Copy and Swap Idiom 以正确的方式执行。

您还应该查看 Rule of Three

答案 2 :(得分:3)

试试这个:

class test
{
public:
    int member;
    test(int i) : member(i) {}

    operator int() {return this->member;}
};

int main(void)
{
    int i;
    test t = 90;

    cout << (i = t);
    return 0;
}

答案 3 :(得分:1)

赋值运算符不能是友元函数。赋值运算符只能声明为非静态成员函数。这是为了确保它接收L值作为其第一个操作数。对于[],()和 - &gt;也是如此。运营商。在您的情况下,由于int是内置类型,因此您无法使用成员函数。您可以实现operator int()以将用户定义的类型转换为int。