Нет никакой групповой команды к , очищают консоль на обеих платформах .
#include
void clear_screen()
{
#ifdef WINDOWS
std::system("cls");
#else
// Assume POSIX
std::system ("clear");
#endif
}
Конечно, полезно понимать разницу, когда кто-то создает компиляторы.
Вот несколько статей, которые я написал о том, как различные проблемы в управлении памятью влияют на разработка и реализация языка C # и среды CLR:
Конструкция копирования удалена для временного (разрешено стандартом. 12.8 п. 5).
Однако в стандарте четко указано (12.2 п. 1):
«Даже когда создание временного объекта избегается (12.8), все семантические ограничения должны соблюдаться, как если бы временный объект был создан. [Пример: даже если конструктор копирования не вызывается, все семантические ограничения, такие как доступность (пункт 11), должно быть выполнено.] "
(также, при поиске правильной цитаты, нашел этот дубликат :)
Изменить: добавление соответствующего местоположения из стандарта
Этот код компилируется с gcc 4.3.3 и 4.4.1. Может, это просто ошибка в gcc 4.1?
Предполагая, что опубликованный вами код является единственным кодом в проекте, и нигде не происходит скрытой передачи Foos по значению, все, что я могу понять, это то, что gcc оптимизирует
Foo foo;
foo = Foo();
в
Foo foo = Foo();
... что неразумно, так как первая форма является конструкцией по умолчанию и присваиванием, а вторая эквивалентна
Foo foo(Foo());
... которая явно является копирующей конструкцией. Если я прав, конструктор копирования не запускается, потому что GCC может оптимизировать избыточное временное; это разрешено спецификацией C ++
В общем, иметь операторы присваивания и конструкторы копирования на разных уровнях защиты - не лучшая идея; как вы видели, результаты могут быть не интуитивными.
Copy Ctor вызывается, когда:
Таким образом, вы определенно выполняете один или оба эти случая где-то в вашем коде. Вам следует сделать Copy Ctor общедоступным или избегать двух предыдущих случаев.
Конструктор копирования будет вызван, если вы напишете
Foo foo; // normal constructor
Foo foo1(foo); //copy constructor
. В вашем случае сначала вызывается конструктор по умолчанию, а затем метод operator =.
#include <iostream>
using namespace std;
class Foo
{
public:
Foo() { cout << "Foo::Foo()" << endl << endl; }
Foo& operator=(const Foo&) { cout << "Foo::operator=(const Foo&)" << endl << endl; }
Foo(const Foo& b) { *this = b; cout << "Foo::Foo(const Foo&)" << endl << endl; }
};
int main()
{
Foo f1;// default constructor called
Foo f2 = f1; //copy constructor called
}
Отметьте это в Foo f2 = f1;
( f2
создается с использованием конструктора копирования)