2016-04-19 3 views
-1

У меня есть задача объединить два файла с помощью функции. Так что я пытался это сделать:Зачем нам передавать файлы по ссылке на функции в C++?

#include <iostream> 
#include <fstream> 
#include <cstring> 

using namespace std; 

void concatenateFiles(ifstream fileA, ifstream fileB, ofstream fileAB){ 
    ... 
} 

Но у меня все еще была ошибка, которую я не мог понять. Поэтому я изменил это на:

... 

void concatenateFiles(ifstream &fileA, ifstream &fileB, ofstream &fileAB){ 
    ... 
} 

И это сработало, но я не совсем уверен, почему. Я предполагаю, что это имеет какое-то отношение к неспособности доступа к файлам, если они не были переданы по ссылке. Может быть, C++ не может сделать копию файла, как если бы он делал копии других переменных, если они не были переданы по ссылке? Это насколько я могу с этим справиться. Это мой первый курс программирования, поэтому, если вы, ребята, могли бы максимально легко ответить на вопрос, было бы здорово!

Спасибо, Рами.

+1

Да, ['std :: ifstream'] (http://en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream) не предоставляет конструктор копирования. –

+0

Что это значит для копирования потока? –

+0

@DavidSchwartz Я до сих пор не полностью понял концепцию «потока», поэтому пока не могу рассуждать на этом уровне:/ –

ответ

2

std::ifstream (и другие классы потоков) не реализует конструктор копирования (и это правильно). В C++ 11 и более поздних версиях конструктор копии по умолчанию компилятора явно отключен с помощью = delete. Таким образом, вы не можете передать объект std::ifstream в параметр по значению, только по ссылке.

+0

Копировать конструктор. Понял. Я смотрю в это спасибо! –

2

Вы не можете этого сделать, потому что для передачи по значению потребуется конструктор копирования. Тем не менее, конструктор копирования explicitly deleted на std::basic_istream уровне *

basic_istream(const basic_istream& rhs) = delete; 

Проходя через указатель или по ссылке, с другой стороны, не требует конструктор копирования, так что это разрешено.

* Перед введением функции delete в C++ 11 конструктор был private.

+0

Он явно удален только в C++ 11 и более поздних версиях. –

+0

@RemyLebeau Спасибо за примечание. Я продолжаю думать о функциональности C++ 11 как о «новом стандарте», а C++ 14 - о «новом переднем крае», но я уверен, что там есть код C++ 98. – dasblinkenlight

+0

так что я предполагаю, что конструктор копирования похож на определение того, как скопировать этот файл? Я еще не встречал этот термин. Я совсем недавно начал занятия. –

Смежные вопросы