Попытка собрать некоторое использование:
Привязка некоторого временного файла к ссылке на константу, для удлинения ее времени жизни. ссылка может быть основой - и деструктор ее не должен быть виртуальным - правильный деструктор все еще называют:
ScopeGuard const& guard = MakeGuard(&cleanUpFunction);
Объяснение , с помощью кода:
struct ScopeGuard {
~ScopeGuard() { } // not virtual
};
template<typename T> struct Derived : ScopeGuard {
T t;
Derived(T t):t(t) { }
~Derived() {
t(); // call function
}
};
template<typename T> Derived<T> MakeGuard(T t) { return Derived<T>(t); }
Этот прием используется в классе утилиты ScopeGuard Alexandrescu. После того как временный файл выходит из объема, деструктор Полученных называют правильно. Вышеупомянутый код пропускает некоторые маленькие детали, но это - грандиозное предприятие с ним.
<час>константа Использования для сообщения методов других не изменит логическое состояние этого объекта.
struct SmartPtr {
int getCopies() const { return mCopiesMade; }
};
<час> константа Использования для классов копии на записи , чтобы заставить компилятор помочь Вам решить, когда и если не необходимо скопировать.
struct MyString {
char * getData() { /* copy: caller might write */ return mData; }
char const* getData() const { return mData; }
};
Объяснение : Вы могли бы хотеть обменяться данными при копировании чего-то, пока данные первоначально и объект copie'd остаются тем же. После того как один из объекта изменяет данные, Вам однако нужны теперь две версии: Один для оригинала, и один для копии. Таким образом, Вы копия на запись к любому объекту, так, чтобы они теперь у обоих была их собственная версия.
использующий код :
int main() {
string const a = "1234";
string const b = a;
// outputs the same address for COW strings
cout << (void*)&a[0] << ", " << (void*)&b[0];
}
вышеупомянутый отрывок печатает тот же адрес на моем GCC, потому что пользовавшаяся библиотека C++ реализует копию на записи std::string
. Обе строки, даже при том, что они - отдельные объекты, совместно используют ту же память для своих строковых данных. Создание b
неконстанта предпочтет версию неконстанты operator[]
, и GCC создаст копию буфера резервной памяти, потому что мы могли изменить его, и это не должно влиять на данные [1 112]!
int main() {
string const a = "1234";
string b = a;
// outputs different addresses!
cout << (void*)&a[0] << ", " << (void*)&b[0];
}
<час> , Чтобы конструктор копии сделал копии с объектов константы и временных файлов :
struct MyClass {
MyClass(MyClass const& that) { /* make copy of that */ }
};
<час> Для того, чтобы сделать константы, которые тривиально не могут измениться
double const PI = 3.1415;
<час> Для передачи произвольных объектов ссылкой вместо значением - для предотвращения возможно дорогой или невозможной передачи значением
void PrintIt(Object const& obj) {
// ...
}
В зависимости от вашей ОС существуют разные вызовы для изменения текущего каталога. Обычно они изменяют только текущий каталог процесса, запускающего исполняемый файл. После завершения процесса вы попадете в каталог, в котором начали.
Функция chdir ()
. Для получения дополнительной информации используйте man chdir
.
Ну, команда POSIX для изменения текущего каталога:
chdir(const char*path);
См. недавнюю документацию POSIX для chdir ()
здесь . . 1112932]
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
system("C:\\windows\\notepad.exe");
chdir("C:\\windows\\desktop");
return 0;
}
Согласно это