2015-05-30 2 views
0
#include <iostream> 
#include <string.h> 
using namespace std; 

class String 
{ 
    private: 
     enum { SZ=80 }; 
     char str[SZ]; 
    public: 
     String(){ 
      strcpy(str, ""); 
     } 
     String (const char s[]){ 
      strcpy(str,s); 
     } 
     String operator = (String obj){ 
      String newObj; 
      strcpy(newObj.str,obj.str); 
      return newObj; 
     } 
     void display(){ 
      cout << str; 
     } 

}; 
int main() 
{ 
    String s1("ABC"); 
    String s3; 
    s3 = s1; 
    s3.display(); 
return 0; 
} 

Я пытаюсь скопировать одну символьную строку объекта на второй, используя приведенный выше код (оператор присваивания) operator=, почему это не работает? Я старался изо всех сил, но все равно не смог.Оператор присваивания для Char Строка

+0

Почему вы думаете, что вы «не смогли»? Что случилось? (Думаю, вам нужен конструктор копирования?) Также вы знаете, что 'strcpy' является массово небезопасным? Почему вы используете технологию 1800-х годов? –

+0

Я студент SE и читаю об этом ... можете ли вы предоставить мне подробную информацию о том, как это небезопасно? и об этом вопросе. s3 ничего не показывает .. поэтому я думаю, что я потерпел неудачу. – UnKnown

+0

@LightnessRacesinOrbit Я был бы признателен, если бы вы могли предоставить мне книгу C++ для последнего метода, чтобы узнать. – UnKnown

ответ

0

Ваш оператор присваивания не присваивает самой строке, а временному var. Это будет правильный способ сделать это:

String& operator = (const String& obj) { 
    strcpy(str, obj.str); // in this line, obj is copied to THIS object 
    return *this;   // and a reference to THIS object is returned 
} 

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

Есть некоторые другие проблемы в коде:

зЬгср() не следует использовать, так как он не имеет проверки диапазона (размера буфера) и, хотя это небезопасно.

И при использовании строк в качестве параметра (или любых больших объектов, таких как классы с большим количеством элементов, векторов и т. Д.), Вы должны использовать ссылки на const, как в моем примере («const» и «&»). Это безопаснее (потому что вы не можете случайно изменить содержимое параметра) и МНОГО быстрее, поскольку нужно скопировать только (очень маленькую) ссылку, а не весь контент параметра.

Смежные вопросы