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

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

Восстановить пароль Регистрация
 
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
05.08.2010, 00:39     Не пойму как работает класс #1
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 ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.08.2010, 00:50     Не пойму как работает класс #2
для каждого объекта создается свой ptr и выделяется память, при этом данные объектов не пересекаються
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
05.08.2010, 01:46  [ТС]     Не пойму как работает класс #3
Как может быть 2 указателя с одним именем?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.08.2010, 01:48     Не пойму как работает класс #4
Lotles, Легко. Указывают то они на разное.
Lotles
 Аватар для Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
05.08.2010, 01:54  [ТС]     Не пойму как работает класс #5
C++
1
2
3
cout << a << endl;   
 operator char*() {
    return ptr; // как компилятор узнает какой ptr возвратить, их же несколько
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
05.08.2010, 02:02     Не пойму как работает класс #6
Почитай про область видимости переменной.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2010, 02:20     Не пойму как работает класс
Еще ссылки по теме:

Указатели на функции (Прата) - не пойму, как это работает C++
C++ Простенький класс Matrix - не пойму что не так
C++ Не пойму как работает char

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
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;
}
Yandex
Объявления
05.08.2010, 02:20     Не пойму как работает класс
Ответ Создать тему
Опции темы

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