@nik120295

Почему функция «cpy» работает со строками?

Появился глупый вопрос "А ПОЧЕМУ ЭТО РАБОТАЕТ?".
Так вот ,почему функция "cpy" работает ,как с обьектом класса
a.cpy(b).print();
так и с простой строкой
a.cpy(ca).print();
    a.cpy("rap").print();

?
Если она принимает
String &String::cpy(const String& a){}

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

class String
{
public:
    String();//конструктор по умолчанию
    String(const String &st);//конструктор глубого копирования
    String(const char *str);//конструктор по принимаемой строке
    ~String();//деструктор
    //int length() const;//функция возврата длины строки
    String& cpy(const String& a);//функция копирования а в строку
    //String& cat(const String& b);//функция сцепления строки b и  строки
    //int cmp(const String& c)const;//функция проверки строк на эквивалентность
    //String& str(const String& a, const String& b);//поиск подстроки b в а
    void print() const;//функция вывода строки в консоль
private:
    int len;//длина строки
    char *s;//строка
};
String::String()//конструктор по умолчанию
{
    len=1;//длине строки присваеваем 1
    s=new char[len];//выделяем память для строки s динной l
    s[0]='\0';//записываем пустую строку
}

String::String(const char *str)//конструктор по принимаемой строке
{
    len=strlen(str)+1;//длине строки присваеваем длину входящей строки +1
    s=new char[len];//выделяем память для строки s динной len
    strcpy(s,str);//копируем вдящую строку в строку s
}

String::String(const String& st)//конструктор глубого копирования
{
    len=st.len;//длине строки присваеваем длину входящей строки
    s=new char[len];//выделяем память для строки s динной len
    strcpy(s,st.s);//копируем вдящую строку в строку s
}

String::~String()//деструктор
{
    delete []s;//удаляем s
}

int String::length()const//функция возврата длины строки
{
    return len-1;//возращаем длину строки
}

String &String::cpy(const String& a)//функция копирования а в строку
{
    if(!strcmp(s,a.s))//проверям на эквиваленткность строку s  и входящую строку
        return *this;
    len=a.len;//длине строки присваеваем длину входящей строки
    delete []s;//удаляем строку s
    s=new char[len];//выделяем память для строки s динной len
    strcpy(s,a.s);//копируем входящую строку в строку s
    return *this;
}
void String::print() const//функция вывода строки в консоль
{
    cout<<" "<<s<<" "<<endl;//выводим строку s
}
int main(){
    const char *ca="wety";
    String a("Hello"),b(a);
    a.cpy(b).print();
    a.cpy(ca).print();
    a.cpy("rap").print();
}

Все работает и выводит :
"
er
qwerty
wety
rap
"
но все таки почему "оно" так?
Заранее всем спасибо за ответ !!!
  • Вопрос задан
  • 297 просмотров
Решения вопроса 1
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Возьмите за правило делать все конструкторы с одним аргументом explicit (хорошо, есть случаи, когда это может оказаться неудобным, но новичку совет хороший). В этом случае не будет неявных преобразований и ваш код не скомпилируется пока вы не напишите a.cpy(String("rap")).print().

И я всё понимаю, но назвать функцию "cpy"... Так и тянет прочитать по-русски. Эту функцию чисто по смыслу надо заменить на оператор присванивания.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Nipheris
@Nipheris Куратор тега C++
String(const char *str);//конструктор по принимаемой строке

вот и ответ. (конструктор неявного преобразования).

Если хотите проверить - поставьте перед этим конструктором кейворд explicit - и строка
a.cpy("rap").print();

должна перестать компилироваться.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы