Что означает копирование объекта? Есть несколько способов, которыми вы можете копировать объекты - давайте поговорим о 2 видах, на которые вы, скорее всего, ссылаетесь - глубокое копирование и поверхностное копирование.
Так как мы находимся на объектно-ориентированном языке (или, по крайней мере, предполагаем так), допустим, у вас выделена часть памяти. Так как это ОО-язык, мы можем легко ссылаться на фрагменты памяти, которые мы выделяем, потому что они обычно являются примитивными переменными (целыми числами, символами, байтами) или классами, которые мы определили, которые сделаны из наших собственных типов и примитивов. Допустим, у нас есть класс Car следующим образом:
class Car //A very simple class just to demonstrate what these definitions mean.
//It's pseudocode C++/Javaish, I assume strings do not need to be allocated.
{
private String sPrintColor;
private String sModel;
private String sMake;
public changePaint(String newColor)
{
this.sPrintColor = newColor;
}
public Car(String model, String make, String color) //Constructor
{
this.sPrintColor = color;
this.sModel = model;
this.sMake = make;
}
public ~Car() //Destructor
{
//Because we did not create any custom types, we aren't adding more code.
//Anytime your object goes out of scope / program collects garbage / etc. this guy gets called + all other related destructors.
//Since we did not use anything but strings, we have nothing additional to handle.
//The assumption is being made that the 3 strings will be handled by string's destructor and that it is being called automatically--if this were not the case you would need to do it here.
}
public Car(const Car &other) // Copy Constructor
{
this.sPrintColor = other.sPrintColor;
this.sModel = other.sModel;
this.sMake = other.sMake;
}
public Car &operator =(const Car &other) // Assignment Operator
{
if(this != &other)
{
this.sPrintColor = other.sPrintColor;
this.sModel = other.sModel;
this.sMake = other.sMake;
}
return *this;
}
}
Глубокая копия - это если мы объявляем объект, а затем создаем совершенно отдельную копию объекта ... в итоге мы получаем 2 объекта в 2 полностью набора памяти.
Car car1 = new Car("mustang", "ford", "red");
Car car2 = car1; //Call the copy constructor
car2.changePaint("green");
//car2 is now green but car1 is still red.
Теперь давайте сделаем что-то странное. Предположим, что car2 либо запрограммирован неправильно, либо намеренно предназначен для разделения фактической памяти, из которой сделан car1. (Как правило, это ошибка, и в классах это, как правило, обсуждаемое одеяло.) Представьте, что каждый раз, когда вы спрашиваете о car2, вы действительно решаете указатель на пространство памяти car1 ... это более или менее то, что мелкая копия есть.
//Shallow copy example
//Assume we're in C++ because it's standard behavior is to shallow copy objects if you do not have a constructor written for an operation.
//Now let's assume I do not have any code for the assignment or copy operations like I do above...with those now gone, C++ will use the default.
Car car1 = new Car("ford", "mustang", "red");
Car car2 = car1;
car2.changePaint("green");//car1 is also now green
delete car2;/*I get rid of my car which is also really your car...I told C++ to resolve
the address of where car2 exists and delete the memory...which is also
the memory associated with your car.*/
car1.changePaint("red");/*program will likely crash because this area is
no longer allocated to the program.*/
Поэтому, независимо от того, на каком языке вы пишете, будьте очень осторожны с тем, что вы имеете в виду, когда речь идет о копировании объектов, потому что большую часть времени вам нужна глубокая копия.
Что такое конструктор копирования и оператор присваивания копии? Я уже использовал их выше. Конструктор копирования вызывается, когда вы вводите код, такой как Car car2 = car1;
. По существу, если вы объявляете переменную и присваиваете ее в одной строке, тогда вызывается конструктор копирования. Оператор присваивания - это то, что происходит, когда вы используете знак равенства - car2 = car1;
. Уведомление car2
не объявлено в том же заявлении. Две части кода, которые вы пишете для этих операций, вероятно, очень похожи. На самом деле типичный шаблон проектирования имеет другую функцию, которую вы вызываете, чтобы установить все, как только вы убедитесь, что первоначальное копирование / присвоение является законным - если вы посмотрите на написанный мной от руки код, функции почти идентичны.
Как я могу предотвратить копирование моих объектов? Разумное начало - переопределить все способы, которыми вам разрешено выделять память для вашего объекта с помощью закрытой функции. Если вы действительно не хотите, чтобы люди копировали их, вы можете сделать это общедоступным и предупредить программиста, создав исключение и не копируя объект.
Я часто делаю такие презентации и использую Monaco для кода и Chalkboard для текста (в шаблоне, который, в целом, имеет лишь небольшие отличия от шаблона Blackboard, поставляемого с Keynote). Посмотрите на любой из моих PDF-файлов (например, этот ), и вы сможете решить, нравится ли вам эффект.
Если вы делаете презентацию, и вам все равно, что ничего не выстраивается, Вердана - хороший выбор.
Если вы собираетесь распространять свою презентацию, используйте шрифт, который, как вы знаете, есть на всех компьютерах, поскольку использование чего-то еще приведет к тому, что машина все равно вернется к одному из распространенных шрифтов (например, Arial или Times).
Если вы действительно заботитесь о том, чтобы вещи выстраивались в линию, и не распространяете презентацию, подумайте о Консоласе:
Он очень разборчивый, напоминает Verdana, и моноширинный. Выбор цвета, конечно, дело вкуса.
Хотите, чтобы люди сосредоточились на содержании и продемонстрировали, что у вас есть вкус и здравый смысл? Оставайся с курьером. Не вводите новшества только потому, что вы можете (иначе почему бы не создать изящную анимацию для каждого перехода между слайдами, с танцующими буквами ...?).
Courier имеет несколько преимуществ:
Если вы хотите сбросить точку 4, по крайней мере выберите альтернативу, которая сохраняет пункты 1-3. Никогда не позволяйте форме преобладать над функцией.
Я использую DejaVu Sans Mono в размере 16.
ОБНОВЛЕНИЕ: Я перешел на Envy Code R для кодирования и Anonymous Pro для терминала
Но здесь есть здесь ответили перед .