0
爲什麼在此示例程序中未調用複製構造函數?複製構造函數不叫
當input()
返回一個對象的功能,複製是由物體的,但我不能看到拷貝構造函數是根據在控制檯輸出調用。
輸出:
Enter a string: ssssssssss
ssssssssss
Freeing s
代碼:
#include <iostream>
using namespace std;
class Sample {
char *s;
public:
Sample() { s = 0; }
Sample(const Sample &sample) { cout << "copyconstructor\n"; }
~Sample() { if(s) delete[] s; cout << "Freeing s\n"; }
void show() { cout << s << "\n"; }
void set(char *str) {
s = new char[strlen(str) + 1];
strcpy(s, str);
}
};
Sample input() {
char instr[80];
Sample str;
cout << "Enter a string: ";
cin >> instr;
str.set(instr);
return str;
}
int main() {
Sample ob = input();
ob.show();
return 0;
}
http://en.wikipedia.org/wiki/Copy_elision –
如果[copy ellision](http://en.wikipedia.org/wiki/Copy_elision)和[Return Value Optimization](返回值優化)不必被調用, (http://en.wikipedia.org/wiki/Return_value_optimization)。這些優化可以改變程序的可觀察行爲。你如何編譯它?你可以嘗試儘可能少的優化,但我認爲編譯器仍然可以自由地處理這種明顯的情況。其實RVO文章中的例子恰好是您的「問題」。 – luk32
我也認爲這是一個組合的dupe:那些:http://stackoverflow.com/questions/3084753/copy-constructor-is-not-called,http://stackoverflow.com/questions/12686099/copy-constructor-not -calling。第一個是關於RVO的,第二個關於複製橢圓。 – luk32