如何创建一个可以初始化c++数据类型的类
How do I create a class that can initialize C++ data types?
标题基本上说明了一切。我主要是想这样做,这样我就可以创建一个对象(比如,一个自定义字符串对象),它可以初始化其他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。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在函数内部的声明中初始化数组,并在外部使用它
- 继承:构造函数,初始化C++11中基类的类C数组成员