Почему деструктор вызывается в функции Friend - PullRequest
1 голос
/ 18 апреля 2020

Почему деструктор вызывается в этой функции друзей show () C ++? Кроме того, как должен быть инициализирован указатель символа, он был установлен как 0 ... Полный код с main здесь https://justpaste.it/5x7fy

#include<iostream>
using namespace std;
#include<string.h>

class String
{

public:
    char *p;
    int len;
    String()
    {
        cout << "empty constructor" << endl;
        len=0;
        p=0;
    }
    // constructor
    String(const char *s) {
        len=strlen(s);
        p=new char[len+1];
        strcpy(p,s);
    }

    friend String operator+(const String&s, const String&t);
    friend int operator<=(const String&s, const String&t);
    friend void show(const String s);

    ~String() {delete p;}
};

void show(const String s)
{
    cout<<s.p<<endl;
}

Редактировать, читать на конструкторе копирования и добавил один как:

// copy constructor
String(const String &s)
{
    len=s.len;
    p=new char[len+1]; // s.p;//
    strcpy(p,s.p);
}

Параметр функции-друга был передан по значению ранее, и переменная покинула область действия функции show, поэтому был вызван деструктор, теперь он передается по ссылке.

    friend void show(const String & s);
...
    void show(String & s)
    {
        cout<<s.p<<endl;
    }

Редактирование обновило инициализацию символьного указателя в пустом конструкторе.

String() {
    p = new char[1]{'\0'};
    len = 1;
};

[последний источник]: https://www.mediafire.com/file/31gb64j7h77x5bn/class38working.cc/file

Ответы [ 2 ]

4 голосов
/ 18 апреля 2020

Деструктор вызван, потому что s передается по значению. То есть, когда вы вызываете show(something), что-то копируется в s, что позже уничтожается, когда заканчивается выполнение show.

0 голосов
/ 18 апреля 2020

Ваш друг из функции show принимает параметр String для каждого значения, что означает, что независимо от того, какой аргумент передается функции, локальная копия создается и используется внутри функции. Конечно, эта локальная копия уничтожается - опять же, когда заканчивается функция show ().

Если вы передадите строку по ссылке (константная строка ** & ** s), вы не получите дополнительную температуру ни копировать, ни уничтожать.

...