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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
#1

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

05.08.2010, 00:39. Просмотров 460. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2010, 00:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не пойму как работает класс (C++):

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

Указатели на функции (Прата) - не пойму, как это работает - C++
Стивен Прата &quot;Язык программирования C++. Лекции и упражнения&quot; 7 глава, стр. 355, листинг 7.18. fun_ptr.cpp // fun_ptr.cpp --...

Простенький класс Matrix - не пойму что не так - C++
Пытался создать простенький класс Matrix. Падает с сообщением в консоли: Подскажите, пожалуйста, в чём причина? Matrix.h ...

Не пойму, почему не работает - C++
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include&lt;stdio.h&gt; ...

класс с конструктором как он тут работает? - C++
Здравствуйте. Не могу понять как работает программа, помогите разобраться, пожалуйста. # include&lt;iostream&gt; using namespace std; ...

Простая прога на использование конструкторов и деструкторов в с++ не работает ( не пойму почему ( - C++
Вот и дошла я до конструкторов/деструкторов. Но возникла проблема . Первая простая прога- и не работает . Нужно , чтобы просто сначала...

6
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.08.2010, 00:50 #2
для каждого объекта создается свой ptr и выделяется память, при этом данные объектов не пересекаються
1
Lotles
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 167
05.08.2010, 01:46  [ТС] #3
Как может быть 2 указателя с одним именем?
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
05.08.2010, 01:48 #4
Lotles, Легко. Указывают то они на разное.
0
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 возвратить, их же несколько
0
kazak
3038 / 2359 / 157
Регистрация: 11.03.2009
Сообщений: 5,405
Завершенные тесты: 1
05.08.2010, 02:02 #6
Почитай про область видимости переменной.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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;
}
1
05.08.2010, 02:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2010, 02:20
Привет! Вот еще темы с ответами:

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

Как работает вот это Класс Строк? Разбор по функциям - C++
#pragma once #include &lt;iostream&gt; using namespace std; class String { public: String(void); String(const char* str); ...

Класс "Автомат", не пойму ошибки - C++
• Разработать класс Automata (автомат), являющийся упрощённой моделью автомата по продаже горячих напитков. o Изучить принцип...

Класс Стек Stack. не работает класс исключений - C++
Здравствуйте! Решил проверить код на пригодность, но почему то класс исключений выскакивает на ошибке. Я никак не могу понять такие вещи...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru