Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
1

Не пойму как работает класс

05.08.2010, 00:39. Показов 856. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Hi all
Не пойму как работает пример
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
#include <stdafx.h>
#include <conio.h>
using namespace std;
class String {
public:
    char* ptr;
    String(char* s){
    int n = strlen(s);
    ptr = new char[n + 1];
    strcpy(ptr, s);
    }
    String(){
        ptr=new char[1];
        ptr[0]='\0';
    }
    ~String(){
    delete [] ptr;
    cout << "dectruction " << endl;
}
    int operator==(const String &other){
    return (strcmp(ptr, other.ptr) == 0);
    }
    operator char*() {
                return ptr;
    }
};
int main() {
    String a("STRING 1");
    String b("STRING 2");
    String c;                
    cout << "The value of a is: " << endl;
    cout << a << endl;
    cout << "The value of b is: " << endl;
    cout << b << endl;
    cout << "The value of c is between these brackets<";
    cout << c << ">" << endl;
}
Вот выражение
C++
1
    String a("STRING 1");
После него выполняется это
C++
1
2
3
4
    String(char* s){
    int n = strlen(s);
    ptr = new char[n + 1];
    strcpy(ptr, s);
т.е для указателя ptr выделяется память под строку
"STRING 1", указатель указывает на эту память и размещаем в этой памяти строку "STRING 1"

Далее
C++
1
    String b("STRING 2");
После него выполняется это
C++
1
2
3
4
    String(char* s){
    int n = strlen(s);
    ptr = new char[n + 1];
    strcpy(ptr, s);
т.е для указателя ptr выделяется память под строку
"STRING 2", указатель указывает на эту память и размещаем в этой памяти строку "STRING 2"(т.e указатель уже указывает не на "STRING 1", а на "STRING 2")

Далее
C++
1
    String c;
Ну тут аналогично

Далее
C++
1
    cout << a << endl;
После него выполняется это
C++
1
2
    operator char*() {
    return ptr;
Главный вопрос
Почему возвращается строка "STRING 1", ведь указатель указывает на память для строки "c"- String c ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2010, 00:39
Ответы с готовыми решениями:

Не пойму как работает
В учебнике дан пример рекурсии. Вывод цифр целого положительного числа в обратном порядке: var...

Не пойму, как работает.
Закончились идеи, как работает программа... Ничего не выходит... Помогите, если нетрудно Дана...

Не пойму как работает While
n = 4 a = 1 i = 0 summa = 0 while i &lt; n: summa += a a = a/-2 i += 1 # print(summa)

Не пойму как работает Isuidocopen
Привет всем. Очередная проблема. Хочу сделать, чтобы при изменении поля в родительском...

6
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
05.08.2010, 00:50 2
для каждого объекта создается свой ptr и выделяется память, при этом данные объектов не пересекаються
1
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
05.08.2010, 01:46  [ТС] 3
Как может быть 2 указателя с одним именем?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.08.2010, 01:48 4
Lotles, Легко. Указывают то они на разное.
0
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
05.08.2010, 01:54  [ТС] 5
C++
1
2
3
cout << a << endl;   
 operator char*() {
    return ptr; // как компилятор узнает какой ptr возвратить, их же несколько
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
05.08.2010, 02:02 6
Почитай про область видимости переменной.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.08.2010, 02:20 7
Lotles,
a {ptr=0x00244b70 "STRING 1" } String после первого
b {ptr=0x00244bb8 "STRING 2" } String после второго
this 0x0012ff04 {ptr=0x00244c00 "" } String * const после третьего

Вот и все. Так он и вызывает правильно, ибо он считает a при cout<<a; {ptr=0x00244b70 "STRING 1" } ect.

Добавлено через 16 минут
Оу. Так ptr же у вас объект класса. Ну тогда, на адрес можно вообще не смотреть, ибо копия параметра для разных элементов класса...

Аналогично такому:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Test
{
private:
    int x;
public:
    Test(int x_):x(x_){}
    void Print()
    {
        std::cout<< x <<'\n';
    }
};
 
int main()
{ 
    Test x(5);
    Test z(10);
    x.Print();
    z.Print();
    return 0;
}
1
05.08.2010, 02:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2010, 02:20
Помогаю со студенческими работами здесь

Не пойму как работает char
Выдает не символ, а сивол и число!!Это я уже пробую явное приведение. Кто поопытней, поясните!!...

Не пойму как это работает
PS C:\User&gt; (Get-ChildItem -Path &quot;C:\tmp\002&quot;) | Get-Member (Get-ChildItem -Path...

не пойму как работает лазер
вопрос не по теме, но чето начал читать и заинтересовался системой лазерного наведения. вот к...

Не пойму как работает цикл
for(var i=1; i&lt;9;i++){ document.write(&quot;Квадрат&quot; + i + &quot;равен&quot; + i*i + &quot;&lt;br/&gt;&quot;); } ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru