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

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

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

Студворк — интернет-сервис помощи студентам
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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.08.2010, 00:39
Ответы с готовыми решениями:

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

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

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

6
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
05.08.2010, 00:50
для каждого объекта создается свой ptr и выделяется память, при этом данные объектов не пересекаються
1
 Аватар для Lotles
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
05.08.2010, 01:46  [ТС]
Как может быть 2 указателя с одним именем?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.08.2010, 01:48
Lotles, Легко. Указывают то они на разное.
0
 Аватар для Lotles
2 / 2 / 0
Регистрация: 29.12.2009
Сообщений: 167
05.08.2010, 01:54  [ТС]
C++
1
2
3
cout << a << endl;   
 operator char*() {
    return ptr; // как компилятор узнает какой ptr возвратить, их же несколько
0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
05.08.2010, 02:02
Почитай про область видимости переменной.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.08.2010, 02:20
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2010, 02:20
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru