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

Вызов конструктора копии - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.88
Escapable
53 / 53 / 1
Регистрация: 09.11.2010
Сообщений: 120
22.01.2011, 17:02     Вызов конструктора копии #1
Не вызывается конструктор копии из производного класса
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
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
using namespace std;
 
class A
{
    int x;
public:
    A(int _x) {cout << "non-const 'A'" << endl; x = _x; }
    A(const A &ob)
        {
               x += ob.x;   
               cout << "const 'A'" << endl;
        }
 
    int getx() { return x;}
};
 
class B : public A
{
    int y;
public:
    B(int _x, int _y) : A(_x)
    {cout << "non-const 'B'" << endl; y = _y; }
 
    B(const B &ob, const A &ob2) : A(ob2) 
    {
        y += ob.y;
        cout << "const 'B'" << endl;
    }
 
    int gety() { return y; }
};
 
void show(B ob)
{
    cout << ob.getx() << " " << ob.gety() << endl;
}
 
int main()
{
    B ob(10, 50);
    show(ob);
 
return 0;
}
Объясните в чем тут дело и могу ли я вообще использовать такую запись? Особенно волнует 25-ая строка.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2011, 17:02     Вызов конструктора копии
Посмотрите здесь:

C++ Вызов конструктора классf!
вызов конструктора C++
вызов конструктора C++
вызов деструктора для копии C++
C++ Вызов конструктора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
22.01.2011, 18:46     Вызов конструктора копии #2
А чего вы хотите добиться?
Вот, посмотрите, как вызываются конструкторы и деструкторы на простеньком примере.
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
#include <stdio.h>
 
class A {
 public:
  A() { printf("Constructor A.\n"); }
  A(const A& other) { printf("Copy constructor A.\n"); }
  ~A() { printf("Destructor A.\n"); }
};
 
class B : public A {
 public:
  B() { printf("Constructor B.\n"); }
  B(const B& other) { printf("Copy constructor B.\n"); }
  ~B() { printf("Destructor B.\n"); }
};
 
void FooByRef(const A &a) {
  printf("Foo by ref.\n");
}
 
void FooByValue(A a) {
  printf("Foo by value.\n");
}
 
int main(int argc, char *argv[]) {
  B b; // конструктор А, затем B.
  FooByRef(b);    // не вызывается конструктор копии
  FooByValue(b); // вызывается коструктор копии класса А и, по окончанию, деструктор класса А
  return 0; 
}  // деструктор В, потом А.
Escapable
53 / 53 / 1
Регистрация: 09.11.2010
Сообщений: 120
22.01.2011, 20:01  [ТС]     Вызов конструктора копии #3
lemegeton, я хочу понять почему не вызывается конструктор копии производного класса. В данном выше примере вызывается конструктор копии базового класса но не производного. Почему так?

В моем примере, если без всяких cout'ов, должно выбить 20, 100. Но вместо ожидаемых цифр ответ 20, 50.

Поэтому я и спрашиваю, может я путаю какие-либо понятия? Опять же, если я объявляю конструктор копии таким способом
C++
1
2
class B : public A
B(const B  &ob)
компилятор выдает ошибку "нет подходящего конструктора по умолчанию", а если
C++
1
B(const B &ob, const A &ob2) : A(ob2)
, то никаких ошибок нет но я не получаю того значения которого я жду.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
22.01.2011, 20:32     Вызов конструктора копии #4
C++
1
2
class B : public A
B(const B  &ob)
все правильно ругается, чтобы создать копию ob, нужно этот самый ob задать
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.01.2011, 21:23     Вызов конструктора копии #5
Escapable, не понял, чего вы хотели добиться своим кодом, вот пример простенького конструктора копии:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
class Foo
{
public:
    Foo(int a = 0): _a(a) { }
    Foo(const Foo &original): _a(original._a) { }
 
    void print_a() const { std::cout << _a << std::endl; }
 
private:
    int _a;
};
 
int main()
{
    Foo bar1(10);
    Foo bar2(bar1);
 
    bar1.print_a();
    bar2.print_a();
}
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
22.01.2011, 21:30     Вызов конструктора копии #6
Цитата Сообщение от Escapable Посмотреть сообщение
lemegeton, я хочу понять почему не вызывается конструктор копии производного класса.
В вашем примере у производного класса нет конструктора копирования.

Цитата Сообщение от Escapable Посмотреть сообщение
В данном выше примере вызывается конструктор копии базового класса но не производного. Почему так?
В моем примере так происходит потому, что функция принимает в качестве параметра базовый класс.

Вот пример с вызовом конструктора копирования как из базового так и из производного класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A {
 public:
  A() { printf("Constructor A.\n"); }
  A(const A& other) { printf("Copy constructor A.\n"); }
  ~A() { printf("Destructor A.\n"); }
};
 
class B : public A {
 public:
  B() { printf("Constructor B.\n"); }
  B(const B& other) : A(other) { printf("Copy constructor B.\n"); }
  ~B() { printf("Destructor B.\n"); }
};
 
void Foo(const B b) {
}
 
int main(int argc, char *argv[]) {
  B b;
  Foo(b); 
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2011, 21:40     Вызов конструктора копии
Еще ссылки по теме:

C++ Вызов конструктора копий
C++ Вызов конструктора класса
C++ Неоднозначный вызов конструктора

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

Или воспользуйтесь поиском по форуму:
Escapable
53 / 53 / 1
Регистрация: 09.11.2010
Сообщений: 120
22.01.2011, 21:40  [ТС]     Вызов конструктора копии #7
lemegeton, громаднейшее вам спасибо! Я нашел свою ошибку. Строку
C++
1
    B(const B &ob, const A &ob2) : A(ob2)
надо было записать
C++
1
B(const B &ob) : A(ob)
, т.е. не лепить туда еще один, никому не нужный, параметр. Думал, что в конструктор копии нужно передавать параметры так, как и в обычный. Еще раз спасибо за помощь!
Yandex
Объявления
22.01.2011, 21:40     Вызов конструктора копии
Ответ Создать тему
Опции темы

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