繁体   English   中英

重载运算符时与返回值混淆

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM