-4
string str=string("123");
string str="123";

一样吗?他们都触发了复制构造函数吗?有人说它们都触发了复制构造函数。但是第一个会省略触发器,对吗?

4

2 回答 2

0

我不知道 C++ 是否定义了一个标准,但是有一种方法可以弄清楚你当前的编译器是如何做到的。

在下面的 CTest 上运行以下测试

TRACE("T1 Start\n");
CTest t1 = CTest("test");

TRACE("T2 Start\n");
CTest t2 = "test";

测试类:

TRACE 可以替换为 printf 或其他调试跟踪函数。

class CTest
{
public:
    CTest(){
        TRACE("CTest()\n");
        m_pTest = NULL;
    }

    CTest(const char * pTest){
        TRACE("CTest(const char * pTest)\n");
        m_pTest = pTest;
    }

    CTest(CTest & test){
        TRACE("CTest(CTest & test)\n");
        m_pTest = test.m_pTest;
    }

    CTest & operator = (const CTest & test){
        TRACE("CTest & operator = (const CTest & test)\n");
        m_pTest = test.m_pTest;
        return *this;
    }

    CTest & operator = (const char * pTest){
        TRACE("CTest & operator = (const char * pTest)\n");
        m_pTest = pTest;
        return *this;
    }

    const char * m_pTest;
};

我当前的编译器(MSVC 2010)在这两种情况下都直接调用构造函数。

T1 Start
CTest(const char * pTest)
T2 Start
CTest(const char * pTest)
于 2013-04-26T03:10:16.253 回答
-1
string str=string("123");
string str="123";

这两个示例都使用了复制构造函数。

于 2013-04-26T02:51:29.213 回答