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

Повторный вызов конструктора?! - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сортировка чисел http://www.cyberforum.ru/cpp-beginners/thread930025.html
Всем добрый вечер! Прошу вашего прощения за тупость,и помощи. Мне было поставлено несложное задание на плюсах, но столкнулся с проблемой В написании одного алгоритма - сказывается нехватка знаний. Мне нужен алгоритм, сортирующий (не подходящее слово, но не могу подобрать лучше) числа. Дан матрица, предположим 5*5. Заполнена полностью нулями. Используется двоичная с/с. Нужно чтоб были...
C++ Крестики-нолики, проверка Подскажите пожалуйста как тут реализовать проверку по прямой и по диагонали? #include <iostream> #include <cmath> using namespace std; class Board { protected: http://www.cyberforum.ru/cpp-beginners/thread930012.html
C++ функия NtCreateUserProcess
как использоват эту функцию и какие параметры надо передавать заранее спасибо
Искусственный интелект для игры C++
Подскажите, есть ли современные игры, для которых можно писать интеллект, или игра которая и состоит в том, что бы писать интеллект. Главное не супер качество графики, и еще что либо, а что бы было интересно, и людей было много. Сам искал, но не нашел. Помогите, чем можете.
C++ Объявление переменных в С++ http://www.cyberforum.ru/cpp-beginners/thread929989.html
Начал изучение С++ и возник такой вопрос как повторно производить действия с переменными после их объявления?
C++ Работа с back_inserter(); Почему в алгоритме copy() я не могу использовать back_inserter()? #include <iostream> #include <iterator> #include <vector> #include <deque> #include <algorithm> #include <list> #include <set> #include "my_iterator.h" подробнее

Показать сообщение отдельно
CatsCanFly
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 21
29.07.2013, 21:56  [ТС]     Повторный вызов конструктора?!
Если можно, продолжу свои вопросы по данной задаче:

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
class CString
{
private:
    char* str;
    int len;
    int real_size;
public:
    CString() : len(0), real_size(10)
    {
        this->str = (char*)malloc(this->real_size * sizeof(char));
    }
 
    CString(char str_arg[])
    {
        cout<<"overloaded constuctor arg \n";
        this->len = char_arr_length(str_arg);
        this->real_size = this->len + 10;
        this->str = (char*)malloc(this->real_size * sizeof(char));
        this->set(str_arg);
    }
 
    CString (const CString & x)
    {
        this->len = x.len;
        this->real_size = x.real_size;
        this->str = (char*)malloc(this->real_size * sizeof(char));
        this->set(x.str);
    }
 
 
    CString & set(char* str_arg)
    {
        cout<<"overloaded constuctor copy \n";
        for(int i = 0; str_arg[i] != 0; i++)
        {
            this->str[i] = str_arg[i];
        }
        str[this->len] = 0;
        return *this;
    }
 
    CString & operator=(char* str_arg)
    {
        cout<<"overloaded operator \"=\"\n";
        int new_length = this->char_arr_length(str_arg);
        if (new_length >= this->real_size)
            this->reallocate(new_length + 10);
        this->len = new_length;
        this->set(str_arg);
        return *this;
    }
 
    bool operator == (CString & _str)
    {
        if (this->len != _str.len)
            return false;
        for (int i = 0; i < this->len; i++)
        {
            if (_str.str[i] != this->str[i])
                return false;
        }
        return true;
    }
 
    bool operator != (CString & _str)
    {
        if (this->len != _str.len)
            return true;
        for (int i = 0; i < this->len; i++)
        {
            if (_str.str[i] != this->str[i])
                return true;
        }
        return false;
    }
 
    ~CString()
    {
        free(this->str);
    }
 
    char &operator [] (int addr)
    {
        return this->str[addr];
    }
 
private:
    int char_arr_length(char str_arg[])
    {
        int i;
        for(i = 0; str_arg[i] != 0; i++);
        return i;
    }
 
    void reallocate(int new_length)
    {
        free(this->str);
        this->real_size = new_length;
        this->str = (char*)malloc(this->real_size * sizeof(char));
    }
 
    friend ostream & operator << (ostream & output, CString & _str)
    {
        output << _str.str;
        return output;
    }
};
При таком создании объекта:
C++
1
CString str("test");
или при таком
C++
1
CString str = "test";
В обоих случаях сначала вызывается конструктор с принимаемым аргументом - массив чаров, а затем конструктор копирования! Почему так? Поясните мне пожалуйста.
Далее, если после этого сделать
C++
1
str = "yyy";
То вызывается сначала перегруженный оператор присваивания, а потом снова конструктор копирования!
Так же большая просьба в целом по коду сказать, что у меня сделано еще неправильно/неэффективно (не уверен насчет возвращения по ссылке объектом самого себя у оператора присваивания)
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru