Форум программистов, компьютерный форум CyberForum.ru

Конструктор копирования - C++

Восстановить пароль Регистрация
 
moskitos80
 Аватар для moskitos80
39 / 39 / 0
Регистрация: 04.10.2011
Сообщений: 128
08.08.2012, 17:33     Конструктор копирования #1
Всем привет. У меня такая проблема: есть некий класс, допустим Test:

C++
1
2
3
4
5
6
7
8
9
10
11
class Test 
{
    protected:
        int value;
 
    public :
        Test(int v)
        {
            this->value = v;
        }
};
Этот класс я указал просто для наглядности проблемы. Я хочу при инициализации объектов использовать такой синтаксис:

C++
1
2
Test t = 10,
       t2 = t;
В принципе конструктор: Test(int v) мне это как раз и позволяет. А теперь такая ситуация, представим что при копировании мне нужно производить некие дополнительные действия, не важно какие. Первой моей попыткой было переопределить конструктор копирования (полный листинг)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
using namespace std;
 
////////////////////////////////////////////////////////////////////////////////
 
class Test 
{
    protected:
        int value;
 
      public :  
          
          Test(int v)
          {
              this->value = v;
          }
          Test(Test& t)  // Переопределил :)
          {
              this->value = t.value;
          }
};
 
////////////////////////////////////////////////////////////////////////////////
 
int main() 
{
    Test t  = 10,  // error: no matching function for call to 'Test::Test(Test)'
           t2 = t;
    
    system("PAUSE");
    return 0;
}
И вот тут компилятор выдаёт: error: no matching function for call to 'Test::Test(Test)' Но я не могу определить такую конструкцию: Test(Test) - это получается конструктор копирования с параметром передаваемым по значению, а это не допустимо. Вот и вопрос как в подобной ситуации переопределить конструктор копирования?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2012, 17:33     Конструктор копирования
Посмотрите здесь:

C++ Конструктор копирования
C++ Конструктор копирования
конструктор копирования C++
Конструктор копирования C++
конструктор копирования C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.08.2012, 17:40     Конструктор копирования #2
C++
1
Test(const Test&)
moskitos80
 Аватар для moskitos80
39 / 39 / 0
Регистрация: 04.10.2011
Сообщений: 128
08.08.2012, 17:46  [ТС]     Конструктор копирования #3
Цитата Сообщение от soon Посмотреть сообщение
C++
1
Test(const Test&)
Да так работает, а не могли бы Вы объяснить почему так правильно?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.08.2012, 18:09     Конструктор копирования #4
Цитата Сообщение от moskitos80 Посмотреть сообщение
Да так работает, а не могли бы Вы объяснить почему так правильно?
В данном случае "правильно" - не то слово. Скорее "работает". А правильно вызывать конструтор и передавать ему параметр. И писать explicit.

Так вот, в случае с Test&, у компилятора есть два пути, один из которых - кастануть 10 в Test и попробовать вызвать конструтор с параметром Test. Поскольку Test& - lvalue, а Test может быть как rvalue, так и lvalue, то и преобразовать не получается.

Поэтому, более правильно будет добавить explicit и использовать Test t(10). Но раз вам нужен другой синтаксис - используйте просто const Test&
moskitos80
 Аватар для moskitos80
39 / 39 / 0
Регистрация: 04.10.2011
Сообщений: 128
08.08.2012, 18:27  [ТС]     Конструктор копирования #5
Цитата Сообщение от soon Посмотреть сообщение
Поскольку Test& - lvalue, а Test может быть как rvalue, так и lvalue, то и преобразовать не получается.
Вы меня простите пожалуйста, я не очень понимаю, что это значит rvalue и lvalue. Я только недавно начал изучать С++
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.08.2012, 18:30     Конструктор копирования #6
moskitos80, можете считать, что lvalue может находиться как слева от знака присваивания, так и справа. rvalue-же может быть только справа. Сначала это не столь важно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2012, 18:37     Конструктор копирования
Еще ссылки по теме:

C++ Конструктор копирования
C++ конструктор копирования
Конструктор копирования C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
moskitos80
 Аватар для moskitos80
39 / 39 / 0
Регистрация: 04.10.2011
Сообщений: 128
08.08.2012, 18:37  [ТС]     Конструктор копирования #7
Теперь понял спасибо, а про explicit мне ещё только предстоит узнать
Yandex
Объявления
08.08.2012, 18:37     Конструктор копирования
Ответ Создать тему
Опции темы

Текущее время: 22:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru