[英]Confused with the return values while overloading the operators
在下面的代码中,我不明白调用运算符后返回的值。 返回的值是 (char*) 类型,它被初始化的变量类型是 String。 C++ 是否负责内部转换?
#include <iostream>
using namespace std;
#include <string.h> //for strcpy()
class String //user-defined string type
{
private:
enum { SZ = 80 }; //size of all String objects
char str[SZ]; //holds a C-string
public:
String() //no-arg constructor
{
str[0] = '\0';
}
String( char s[] ) //1-arg constructor
{
strcpy(str, s); // convert C-string to String
}
void display() const //display the String
{
cout << str;
}
operator char*() //conversion operator
{
return str; //convert String to C-string
}
};
int main()
{
String s1; //use no-arg constructor
char xstr[] = "Joyeux Noel! "; //create and initialize C-string
s1 = xstr; //use 1-arg constructor
s1.display(); //display String
String s2 = "Bonne Annee!"; //uses 1-arg constructor
s1=(char*)s2;
cout << s1;
cout << endl;
return 0;
}
对于本声明中的初学者
s1 = xstr; //use 1-arg constructor
使用由编译器隐式定义的默认复制赋值或移动赋值运算符(在您的类定义的情况下,编译器应隐式声明两个赋值运算符)。 即首先使用 1-arg 构造函数创建 String 类型的临时对象,并通过复制其数据成员将该对象分配给对象 s1。
在这个声明中也出现了同样的情况。
s1=(char*)s2;
那就是使用默认的复制赋值或移动赋值运算符。 首先,使用接受char *
类型对象的转换构造函数创建 String 类型的临时对象。 然后将此对象分配给对象 s1。
更准确地说,在这个表达式中
(char*)s2
有明确称为转换运算符
operator char*() //转换 operator { return str; //将字符串转换为C字符串 }
所以表达式的类型是char *
。
类中没有赋值运算符接受char *
类型的对象作为右操作数。 但是在类中声明了隐式转换构造函数
String( char s[] ) //1-arg constructor
{
strcpy(str, s); // convert C-string to String
}
可以将char *
类型的对象转换为String
类型的对象。
在这样的转换之后,可以应用默认的复制赋值或移动赋值运算符,并将创建的临时对象分配给对象 s1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.