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

Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. - C++

Восстановить пароль Регистрация
 
Casper-SC
 Аватар для Casper-SC
3465 / 1684 / 173
Регистрация: 27.03.2010
Сообщений: 4,824
Записей в блоге: 1
12.03.2012, 03:31     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. #1
Cat.h
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
#pragma once
 
namespace Casper
{
    class Cat
    {
    private:
        unsigned int age;
        float weight;
 
    public:
        Cat(void);
        Cat(unsigned int age, float weight);
        ~Cat(void);
 
        unsigned int GetAge() const;
        void SetAge(unsigned int newAge);
 
        float GetWeight() const;
        void SetWeight(float newWeight);
 
        void Meow();
    };
}

Cat.cpp
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
46
#include "Cat.h"
#include <iostream>
 
namespace Casper
{
    Cat::Cat(void)
    {
        age = 0;
        weight = 0;
    }
 
    Cat::Cat(unsigned int age, float weight)
    {
        this->age = age;
        this->weight = weight;
    }
 
    Cat::~Cat(void)
    {
    }
 
    unsigned int Cat::GetAge() const //const означает, что метод не может изменять значения класса
    {
        return age;
    }
 
    void Cat::SetAge(unsigned int newAge)
    {
        age = newAge;
    }
 
    float Cat::GetWeight() const
    {
        return weight;
    }
 
    void Cat::SetWeight(float newWeight)
    {
        weight = newWeight;
    }
 
    void Cat::Meow()
    {
        std::cout << "Мяу" << std::endl;
    }
}


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 <iostream>
#include "Cat.h"
 
using namespace std;
 
const Casper::Cat * const DisplayCatInfo(const Casper::Cat * const cat);
Casper::Cat & GetNewCat();
 
int main()
{
    setlocale(LC_ALL, "Russian");
        //Создаю ссылку на объект типа Cat, ссылка не может быть null, она может указывать
        //только на этот объект
    Casper::Cat & rCat = GetNewCat(); //Получаю адрес значения находящегося в куче
    DisplayCatInfo(&rCat); //передаю значение по ссылке (тоесть адрес самого значения)
 
    Casper::Cat cat(5, 2.45F); //тут создаю объект в стеке
    DisplayCatInfo(&cat); //передаю адрес объекта созданного в стеке
 
    system("pause");
    return EXIT_SUCCESS;
}
 
Casper::Cat & GetNewCat()
{
        //Создаю указатель, который указывает на объект созданный в куче
    Casper::Cat * cat = new Casper::Cat(3, 2.89F);
        //Возвращаю значение, сам указатель "умирает".
    return *cat;
}
 
//Создаётся локальный для функции указатель, который получает адрес значения ему переданного
const Casper::Cat * const DisplayCatInfo(const Casper::Cat * const cat) //(Параметр) Константный указатель на константный объект
{
    cout << "Возраст кота: " << cat->GetAge() << "\tВес кота: " << cat->GetWeight() << endl;
    return cat; //чисто для примера, так как не имеет смысла
}
Я прокоментировал в коде. Скажите правильно ли я всё понимаю?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2012, 03:31     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет.
Посмотрите здесь:

Цикл: правильно или нет? C++
C++ Посмотрите правильно или нет.
C++ C++ | Правильно ли я сделал задание | Массивы | Указатели и Ссылки
C++ Правильно ли я понимаю работу этого кода?
C++ Операции с числами(правильно или нет)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
12.03.2012, 13:33     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. #2
Цитата Сообщение от Casper-SC Посмотреть сообщение
DisplayCatInfo(&rCat); //передаю значение по ссылке (тоесть адрес самого значения)
не по ссылке, а по указателю
Цитата Сообщение от Casper-SC Посмотреть сообщение
Casper::Cat & rCat = GetNewCat(); //Получаю адрес значения находящегося в куче
я б не сказал что адрес, ты просто ссылаешься на объект
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.03.2012, 14:06     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. #3
C++
1
2
3
4
5
6
7
Casper::Cat & GetNewCat()
{
        //Создаю указатель, который указывает на объект созданный в куче
        Casper::Cat * cat = new Casper::Cat(3, 2.89F);
        //Возвращаю значение, сам указатель "умирает".
        return *cat;
}
Указатель не умирает. Ибо память выделена динамически. Зато нигде не очищается.
Casper-SC
 Аватар для Casper-SC
3465 / 1684 / 173
Регистрация: 27.03.2010
Сообщений: 4,824
Записей в блоге: 1
12.03.2012, 17:03  [ТС]     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. #4
Цитата Сообщение от ForEveR Посмотреть сообщение
Указатель не умирает. Ибо память выделена динамически. Зато нигде не очищается.
Как не умирает? Сам указатель умирает, а не объект на который он указывает. Сам указатель же тоже из себя что-то представляет, вот сам указатель я так понимаю после выхода с функции уничтожается.

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
Зато нигде не очищается.
Я ставил целью понять что происходит в коде. Прога сразу завершается, так что смысла нету в очистке памяти, хотя понимаю что это надо делать, и по правде я просто забыл её очистить (привык что Garbage Collector чистит за меня (в C#)).

Добавлено через 2 минуты
Цитата Сообщение от OstapBender Посмотреть сообщение
я б не сказал что адрес, ты просто ссылаешься на объект
Ну это я тоже понимаю, но я хотел описать детально чтоли. В функции я создал объект класса Cat и передал при выходе из функции адрес этого объекта. А то что я ссылаюсь на объект это и так понятно.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.03.2012, 17:03     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. #5
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int& foo(const int value)
{
   return *(new int(value));
}
 
int main()
{
   int& val = foo(1);
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
forever@pterois:~/My_pro1/cpp_pro$ valgrind ./new 
==22713== Memcheck, a memory error detector
==22713== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==22713== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==22713== Command: ./new
==22713== 
==22713== 
==22713== HEAP SUMMARY:
==22713==     in use at exit: 4 bytes in 1 blocks
==22713==   total heap usage: 1 allocs, 0 frees, 4 bytes allocated
==22713== 
==22713== LEAK SUMMARY:
==22713==    definitely lost: 4 bytes in 1 blocks
==22713==    indirectly lost: 0 bytes in 0 blocks
==22713==      possibly lost: 0 bytes in 0 blocks
==22713==    still reachable: 0 bytes in 0 blocks
==22713==         suppressed: 0 bytes in 0 blocks
==22713== Rerun with --leak-check=full to see details of leaked memory
==22713== 
==22713== For counts of detected and suppressed errors, rerun with: -v
==22713== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 6)
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int& foo(const int value)
{
   return *(new int(value));
}
 
int main()
{
   int& val = foo(1);
   delete &val;
}
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
forever@pterois:~/My_pro1/cpp_pro$ valgrind ./new 
==22798== Memcheck, a memory error detector
==22798== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==22798== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==22798== Command: ./new
==22798== 
==22798== 
==22798== HEAP SUMMARY:
==22798==     in use at exit: 0 bytes in 0 blocks
==22798==   total heap usage: 1 allocs, 1 frees, 4 bytes allocated
==22798== 
==22798== All heap blocks were freed -- no leaks are possible
==22798== 
==22798== For counts of detected and suppressed errors, rerun with: -v
==22798== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 6)
Мб я вас просто неверно понял и вы имели ввиду, что переменная выходит из области видимости.
Casper-SC
 Аватар для Casper-SC
3465 / 1684 / 173
Регистрация: 27.03.2010
Сообщений: 4,824
Записей в блоге: 1
12.03.2012, 17:18  [ТС]     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. #6
Или всё же я где-то не прав?

Добавлено через 15 минут
Цитата Сообщение от ForEveR Посмотреть сообщение
Мб я вас просто неверно понял и вы имели ввиду, что переменная выходит из области видимости.
Я имел ввиду:
Цитата Сообщение от Casper-SC Посмотреть сообщение
Сам указатель умирает, а не объект на который он указывает. Сам указатель же тоже из себя что-то представляет, вот сам указатель я так понимаю после выхода с функции уничтожается.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
12.03.2012, 17:21     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. #7
Цитата Сообщение от Casper-SC Посмотреть сообщение
Или всё же я где-то не прав?
Вы правы. Объект типа Cat остается в куче. Указатель (если его рассматривать, как объект типа Cat * созданный на стеке) умирает.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.03.2012, 18:29     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. #8
Да. Я просто неправильно понял. Извиняюсь.
Но такие возвраты делать все же не стоит... Неэстетично вот такое delete &var;
Плюс к тому, раз ранее был шарп, рекомендую использовать новый стандарт (std::shared_ptr<T>, лямбды и т.д.) или хотя бы буст (boost::shared_ptr<T>).
Casper-SC
12.03.2012, 18:41  [ТС]
  #9

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Плюс к тому, раз ранее был шарп, рекомендую использовать новый стандарт (std::shared_ptr<T>, лямбды и т.д.) или хотя бы буст (boost::shared_ptr<T>).
Я читаю книгу: "Джесс Либерти - Освой C++ самостоятельно за 21 день". Дочитал до ссылок с указателями (~260 страниц из ~850). Есть ли какие-то новые книги, где более новая инфа, с использованием стандарта нового? Желательно на русском, по-английски осилю с Lingvo x5 Pro, но это так нудно и долго (хотя читая, английский всё же учишь немножко).

Boost скачал, там много заголовочных файлов и непонятно что куда пихать и как использовать.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2012, 18:44     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет.
Еще ссылки по теме:

Подскажите правильно, или нет. Ввести с клавиатуры вещественную матрицу размерностью 5х5, определить C++
Проверить, правильно ли в текст входят круглые скобки. Ответ ДА или НЕТ с++ C++
Написал программу, не могу понять правильно или нет C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
12.03.2012, 18:44     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет.
  #10

Не по теме:

Casper-SC, Ну по всему нужно читать документацию. Тем более по бусту. А на тему нового стандарта... На русском книг точно нет. На английском как бы тоже полной еще нету.
Можно почитать стандарт С++0x. Или в гугле вбить и почитать на той же вики.

Yandex
Объявления
12.03.2012, 18:44     Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет.
Ответ Создать тему
Опции темы

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