在這個程序中,我完全理解爲什麼主函數的第一部分失敗並需要註釋 - 在我在TestingClass中實現值ctor後沒有隱式的默認ctor。完全合乎邏輯。但是,我發現第二部分(test2對象的創建)成功,至少在gcc 4.8.4中,我有點驚訝。沒有默認構造函數的初始化時的賦值
#include <iostream>
using namespace std;
class TestingClass
{
public:
TestingClass(int inVal)
{
val = inVal;
}
int val;
};
TestingClass testingCreator()
{
return TestingClass(100);
}
int main()
{
/*
TestingClass test1;
test1 = testingCreator();
cout << "Test1: " << test1.val << endl;
*/
TestingClass test2 = testingCreator();
cout << "Test2: " << test2.val << endl;
}
關於它的思考,這也是情理之中,因爲對象,TEST2,以後再也沒有被修建/初始化存在,但大多數人在這種思維方式初始化爲只是做了聲明和賦值在一條線上。顯然,雖然初始化比這個更特別,因爲這個代碼有效。
這是標準C++嗎?它是否可以跨編譯器工作?我感興趣的是如何以這種方式初始化不同於聲明(使用默認ctor)然後賦值(通過在全局函數中創建的臨時對象)。
UPDATE:增加了一個副本ctor和明確使用copy ctor的第三種情況。
#include <iostream>
using namespace std;
class TestingClass
{
public:
TestingClass(const TestingClass &rhs)
{
cout << "In copy ctor" << endl;
this->val = rhs.val + 100;
}
TestingClass(int inVal)
{
val = inVal;
}
int val;
};
TestingClass testingCreator()
{
return TestingClass(100);
}
int main()
{
/*
TestingClass test1;
test1 = testingCreator();
cout << "Test1: " << test1.val << endl;
*/
TestingClass test2 = testingCreator();
cout << "Test2: " << test2.val << endl;
TestingClass test3(test2);
cout << "Test3: " << test3.val << endl;
}
此輸出:
Test2: 100
In copy ctor
Test3: 200
「但是大多數人會這樣認爲初始化只是作爲一行中的聲明和賦值」......而不是大多數C++程序員。 (希望沒有任何!) –