Я написал небольшую тестовую программу с классом образцов, содержащую также самоопределяемый конструктор, деструктор, конструктор копирования и оператор присваивания. Я был удивлен, когда я понял, что конструктор копирования не был вызван вообще, хотя я реализовал функцию со значениями возвратных моего класса и линии, как 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
я прочитал, что нет гарантии, что компилятор будет использовать явно определенный конструктор копирования. Я не понимаю этого поведения. Почему конструктор копирования даже существует тогда, если мы не знаем, что он называется? Как компилятор решает, использует ли он его?
Или, еще лучше, есть ли способ заставить компилятор использовать самоопределяемый конструктор копирования?
Можете ли вы связать с тем, что вы читаете? Я подозреваю, что вы что-то недопонимаете. –
Опубликовать код. Нам нужно увидеть, как вы определили конструктор копирования. –
Уверен, что o1 неявно не преобразуется в какой-либо другой тип, который Object можно построить? Без конкретного кода нет реального способа узнать, почему ваш код будет терпеть неудачу. –