如何创建一个可以初始化c++数据类型的类

How do I create a class that can initialize C++ data types?

本文关键字:c++ 初始化 数据类型 何创建 创建 一个      更新时间:2023-10-16

标题基本上说明了一切。我主要是想这样做,这样我就可以创建一个对象(比如,一个自定义字符串对象),它可以初始化其他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++标准的目标是防止实现赋值操作符的静态和非成员重载,但是还有其他方法可以做到这一点吗?谢谢你的帮助/建议!

这不是通过赋值操作符完成的,而是通过重载类型转换完成的。这将使您的主函数像预期的那样工作:

#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;
}

您要做的事情需要一个转换操作符

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

对于你想写的类(只包含整数成员),你不需要重载=操作符。

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

如果动态分配指针作为成员函数,则需要重载=操作符,因为在这种情况下,这些指针的浅拷贝将导致所有包含指向相同动态内存位置的成员指针的对象&如果其中一个对象的生命周期结束,其他对象将留下一个悬空指针。
正如@Tony在评论中恰当地指出的那样,浅拷贝通常不好,但并不总是

如果您想重载赋值操作符,请查看复制和交换习惯用法以正确的方式完成。

您还应该查看三规则

试试这个:

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;
}

赋值操作符不能是友元函数。赋值操作符只能声明为非静态成员函数。这是为了确保它接收到l值作为它的第一个操作数。[]、()和->操作符也是如此。在您的示例中,由于int是内置类型,因此不能使用成员函数。可以实现int()运算符将用户定义的类型强制转换为int。