我寫了一個包含自定義構造函數,析構函數,複製構造函數和賦值運算符的樣本類的小測試程序。我很驚訝,當我意識到拷貝構造函數是不是在所有調用,即使我實現我的同班同學的返回值功能和線條狀Object o1; Object o2(o1);
如何強制編譯器使用顯式拷貝構造函數?
innerclass.hpp:
#include <iostream>
class OuterClass
{
public:
OuterClass()
{
std::cout << "OuterClass Constructor" << std::endl;
}
~OuterClass()
{
std::cout << "OuterClass Destructor" << std::endl;
}
OuterClass(const OuterClass & rhs)
{
std::cout << "OuterClass Copy" << std::endl;
}
OuterClass & operator=(const OuterClass & rhs)
{
std::cout << "OuterClass Assignment" << std::endl;
}
class InnerClass
{
public:
InnerClass() : m_int(0)
{
std::cout << "InnerClass Constructor" << std::endl;
}
InnerClass(const InnerClass & rhs) : m_int(rhs.m_int)
{
std::cout << "InnerClass Copy" << std::endl;
}
InnerClass & operator=(const InnerClass & rhs)
{
std::cout << "InnerClass Assignment" << std::endl;
m_int = rhs.m_int;
return *this;
}
~InnerClass()
{
std::cout << "InnerClass Destructor" << std::endl;
}
void sayHello()
{
std::cout << "Hello!" << std::endl;
}
private:
int m_int;
};
InnerClass innerClass()
{
InnerClass ic;
std::cout << "innerClass() method" << std::endl;
return ic;
}
};
innerclass.cpp:
#include "innerclass.hpp"
int main(void)
{
std::cout << std::endl << "1st try:" << std::endl;
OuterClass oc;
OuterClass oc2(oc);
oc.innerClass().sayHello();
std::cout << std::endl << "2nd try:" << std::endl;
OuterClass::InnerClass ic(oc.innerClass());
ic = oc.innerClass();
}
輸出:
1st try:
OuterClass Constructor
OuterClass Copy
InnerClass Constructor
innerClass() method
Hello!
InnerClass Destructor
2nd try:
InnerClass Constructor
innerClass() method
InnerClass Constructor
innerClass() method
InnerClass Assignment
InnerClass Destructor
InnerClass Destructor
OuterClass Destructor
OuterClass Destructor
甲我讀過一些研究,並不保證編譯器會使用明確定義的拷貝構造函數。我不明白這種行爲。爲什麼複製構造函數甚至存在,如果我們不知道它被調用?編譯器如何決定它是否使用它?
或者,更好的辦法是強制編譯器使用自定義的拷貝構造函數嗎?
您可以鏈接到你在讀什麼?我懷疑你誤解了一些東西。 – 2009-04-27 13:28:27
發佈一些代碼。我們需要看看你是如何定義拷貝構造函數的。 – 2009-04-27 13:29:05
確定o1沒有被隱式轉換爲Object可構造的其他類型?沒有特定的代碼,沒有真正的方法來說明爲什麼你的代碼會失敗。 – 2009-04-27 13:31:07