我有以下类,它应该代表一个8位签名字符。
class S8
{
private:
signed char val;
public:
S8 & operator=(const signed char other)
{
if ((void*)this != (void*)&other)
{
val = other;
}
return *this;
}
operator signed char() {signed char i; i = (signed char) val; return i;}
void write (OutputArray & w)
{
/* This function is the whole purpose of this class, but not this question */
}
};
但是,当我为其中一个对象指定负数时,
S8 s;
char c;
s = -4;
c = -4;
printf("Results: %d, %s\n",s,c);
我从printf得到“结果:252,-4”。有没有办法修改类,这样的情况会看到签名char的行为,而不是我得到的unsigned char行为?
谢谢!
答案 0 :(得分:1)
你想要的是从signed char到S8对象的隐式转换;这是通过非默认的复制构造函数完成的。如果定义了带有signed char的copy-constructor,那么编译器将使用它进行隐式转换(假设copy-constructor未定义为“explicit”)。所以,举个例子:
class S8
{
private:
signed char val;
public:
//default constructor
S8() : val(0) {}
//default copy-constructor
S8(const S8& rhs) : val(rhs.val) {}
//allow implicit conversions (non-default copy constructor)
S8(const signed char rhs) : val(rhs) {}
//allow implicit conversions
operator signed char() { return val; }
};
int main()
{
S8 s;
signed char c;
s = -4;
c = -4;
std::cout << (int) s << std::endl;
std::cout << (int) c << std::endl;
return 0;
}
答案 1 :(得分:0)
您的代码完全没有意义,而您遇到的行为完全是任意的,因为不得以这种方式使用printf。 (你是否至少在你的编译器中打开了警告?许多人会标记你的错误!)
除此之外,你的进出转换器做了你想要的,只是表达得很糟糕。在op =中rhs是char,它不可能在你的类的同一地址上,所以你可以继续存储它。
隐式转换op也不需要大惊小怪只返回成员。
为什么你需要这个还不清楚,可能你应该阅读隐式转换和自定义操作。由于它存在各种危险,并且只应由明确知道何时应用转换的人使用,客户端代码是如此欢迎,并且客户端代码不太可能落入存在转换的坑中。< / p>