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

Работа с Умными указателями - C++

Восстановить пароль Регистрация
 
apacen
0 / 0 / 0
Регистрация: 04.06.2012
Сообщений: 3
04.06.2012, 15:46     Работа с Умными указателями #1
Добрый день,
помогите разобраться:
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
#include <iostream>
using namespace std;
 
class NormClass
{
    int a;
public:
    NormClass();
    void DoSomething();
};
 
NormClass::NormClass():a(5)
{}
 
void NormClass::DoSomething()
{
cout << a << "\n";
}
 
class ScopePtr1
{
    NormClass *t;
public:
    ScopePtr1(NormClass *nptr):t(nptr) {}
    NormClass *operator->() { return t;}
};
 
int main()
{
ScopePtr1 sptr = new NormClass();
sptr->DoSomething();
return 0;
}
Мне в этой коде не понятна вот эта инструкция:
C++
1
ScopePtr1 sptr = new NormClass();
В левой части объект ScopePtr1, в правой, как я понимаю создается объект NormClass в куче и возвращается указатель.
Как правильно понимать данную строчку?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2012, 15:46     Работа с Умными указателями
Посмотрите здесь:

работа с указателями C++
C++ Работа с указателями
Работа с указателями C++
работа с указателями C++
C++ работа с указателями
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
04.06.2012, 16:09     Работа с Умными указателями #2
C++
1
ScopePtr1 sptr = new NormClass();
эквивалентно
C++
1
ScopePtr1 sptr(new NormClass());
Добавлено через 5 минут
и память то ваш указатель не освобождает
apacen
0 / 0 / 0
Регистрация: 04.06.2012
Сообщений: 3
04.06.2012, 16:16  [ТС]     Работа с Умными указателями #3
Спасибо!
Я так понял, что эта сигнатура работает, потому что ScopePtr1 имеет конструктор, который принимает в качестве аргумерта класс NormClass?
Или все-таки ее нужно воспринимать по-другому?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
04.06.2012, 16:22     Работа с Умными указателями #4
Цитата Сообщение от apacen Посмотреть сообщение
Я так понял, что эта сигнатура работает, потому что ScopePtr1 имеет конструктор, который принимает в качестве аргумерта класс NormClass?
Да, присвоения тут нет, можно убедиться:
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
#include <iostream>
 
using namespace std;
 
class NormClass
{
    int a;
public:
    NormClass();
    void DoSomething();
};
 
NormClass::NormClass():a(5)
{}
 
void NormClass::DoSomething()
{
    cout << a << "\n";
}
 
class ScopePtr1
{
    NormClass *t;
public:
    ScopePtr1(NormClass *nptr):t(nptr) {
       cout << "constructor" << endl;
    }
    ScopePtr1 & operator =(ScopePtr1 const& other) {
        cout << "operator =" << endl;
        return *this;
    }
    NormClass *operator->() {
       return t;
    }
    ~ScopePtr1() {
        delete t;
        cout << "destructor" << endl;
    }
};
 
int main()
{
    ScopePtr1 sptr = new NormClass();
    sptr->DoSomething();
}
http://liveworkspace.org/code/5c09cf...8fb182dd56e6d0
apacen
0 / 0 / 0
Регистрация: 04.06.2012
Сообщений: 3
04.06.2012, 16:46  [ТС]     Работа с Умными указателями #5
Еще раз спасибо!
Yandex
Объявления
04.06.2012, 16:46     Работа с Умными указателями
Ответ Создать тему
Опции темы

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