какая разница в определении члена объекта значения, указателя или ссылки - PullRequest
0 голосов
/ 07 июня 2011

Я новичок в C ++ и не понимаю, что такое

Я собираюсь определить класс, и когда я должен определить член-указатель? или когда я должен определить член значение? или когда я должен просто определить это как ссылку?

что смутило меня, когда я прочитал книгу TCPL 24.3.3 Он сказал, что «Решение с указателем следует использовать, когда необходимо изменить указатель на« содержащийся »объект в течение срока службы« содержащего »объекта. Например:

class C
{
    int a;
public:
    C(int i):a(i){};
};

class C2
{
    C a;
    C *p;
public:
    C2(int i):a(i), p(new C(i)){};
    ~C2(){delete p;}

    C ChangeValue(C c)
    {
        C temp = a;
        a = c;
        return temp;
    }

    C* ChangePointer(C *c)
    {
        C* temp = p;
        p = c;
        return temp;
    }
};

Я думаю, что нет никакой разницы, используя valus в качестве члена класса ....

, пожалуйста, помогите мне через это:)

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Лучший способ думать об указателях - это "мелкая копия" против "глубокой копии". Когда я работаю с определенным объектом, нормально ли, что он будет дублироваться, когда я передам его в другую область (другую функцию или класс)? Если я не хочу, чтобы он копировался, я должен использовать указатель, в противном случае я могу просто объявить его как значение (я должен отметить, что передача по ссылке - это способ обойти это общее правило).

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

1 голос
/ 07 июня 2011

«Решение указателя следует использовать, когда необходимо изменить указатель на« содержащийся »объект в течение срока службы« содержащего »объекта».

На указатели можно указыватьразные типы объектов.
Ссылки являются псевдонимами типов и не могут быть связаны с другими типами.Они остаются псевдонимами объекта, к которому они были привязаны во время объявления.

Например:

int i,j,k;
i = 10;
j=20;
k=30;
int *ptr;
ptr = &i;       //ptr now points to i
ptr = &j;       //ptr now points to j, Allowed!
int &ref = i;   //ref is alias of i
ref = j;        //Allowed BUT It assigns value of j to i and doesnt point ref to j

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

Примечание. Для указателей можно использовать то же поведение, что и для ссылок, используя const pointers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...