zqxf123456789
_浮生_
2017-05-10 07:11
采纳率: 100%
浏览 1.7k

自定义类的对象在定义时使用等号=初始化会经历哪几个过程?

我自定义了一个String类,在定义它的一个对象时使用等号=初始化,对整个初始化过程有点疑问,请大家指点一下,谢谢!

代码如下:

class String{
public:
    String() :str(""){ cout << "default constructor" << endl; }
    String(int n);
    String(const char *p);

    String(const String &x) :str(x.str)
    {
        cout << "copy constructor" << endl;
    }
    String& operator=(const String &x)
    {
        str = x.str;
        cout << "operator =" << endl;
        return *this;
    }
    string getStr() const
    {
        return str;
    }
private:
    string str;
};

ostream& operator<<(ostream &o,const String &x)
{
    o << x.getStr();
    return o;
}

String::String(int n)
{
    stringstream ss;
    ss << n;
    ss >> str;
    ss.clear();
    ss.str("");
    cout << "String(int n)" << endl;
}

String::String(const char *p)
{
    str = *p;
}

int _tmain(int argc, _TCHAR* argv[])
{
    String s6=10;
    cout << s6 << endl;
    return 0;
}

图片说明
此时结果如图所示,为什么只调用了String::String(int n)构造函数,不是应该还执行String& operator=(const String &x)吗?
我把初始化过程分两步:
String s6;
s6=10;
这样运行的结果如下:
图片说明
先调用默认构造函数,再调用String::String(int n)构造函数,最后调用String& operator=(const String&x),这个就很能理解了,可是为什么之前只调用了String::String(int n)构造函数?之前那样写,究竟是怎么执行的呢?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • lixiaogang_theanswer
    君子黎 2017-05-10 07:48
    已采纳
    //每一个类的对象定义了都必须初始化,当用户没有定义构造函数时候,编译器会自动提供构造函数;
    String s6 = 10;
    实际上编译器执行的过程是String s6 = String(10);即一个隐式的转换过程;这里不是一个把10赋值给
        s6,式一个隐式转换初始化过程;
    你的程序中提供了带参数的构造函数;
        String::String(int n)
    {
        stringstream ss;
        ss << n;
        ss >> str;
        ss.clear();
        ss.str("");
        cout << "String(int n)" << endl;
    }
    
    所以会打印String(int n);
    
    

    望楼主采纳!谢谢~~~

    点赞 评论
  • fuqiangcaizi
    伪码匠 2017-05-10 07:25

    由于类中并没有重载int类型的=号操作,当String s6=10时,发现int类型赋值的时候,发生了隐性转换,由于构造中有String(int n);的实现,所以之执行了这个构造。

    点赞 评论
  • shen_wei
    shen_wei 2017-05-10 07:37
    点赞 评论

相关推荐