Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2010, 22:07   #1
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию Классы

Код:
#include "stdafx.h"
#include "conio.h"
#include <string.h>
using namespace std;
int a;
class String {
private:
    char* ptr;
public:
	String(){
		ptr = new char[1];
        ptr[0] = '\0';
	}
	String(char* s){
		    int n = strlen(s);
            ptr = new char[n + 1];
            strcpy(ptr, s);
	}
	String(const String& src){ 
		    int n = strlen(src.ptr);
            ptr = new char[n + 1];
            strcpy(ptr, src.ptr);
	}

	~String(){
		    delete [] ptr;
			cout << "Destruction " << endl;
	}

    String& operator=(const String& src){
		cpy(src.ptr); 
		return *this;
	}

	String operator+(char* s){
		String new_str(ptr);
            new_str.cat(s);
            return new_str;
	}
    operator char*() {
		return ptr;
	}
	void cat(char* s){
		    int n = strlen(ptr) + strlen(s);
            char* p1 = new char[n + 1];
            strcpy(p1, ptr);
            strcat(p1, s);
            delete [] ptr;
            ptr = p1;
	}
	void cpy(char* s){
		delete [] ptr;
        int n = strlen(s);
        ptr = new char[n + 1];
        strcpy(ptr, s);
 	}
};

int main() {
    String a, b, c;
    a = "I ";
    b = "am ";
    c = "so ";
    String d = a + b + c;
    cout << d << endl;
    return 0;
}
Тут
Код:
void cpy(char* s){
		delete [] ptr;
        int n = strlen(s);
        ptr = new char[n + 1];
        strcpy(ptr, s);
ptr относится к какому объекту ?
Lotles вне форума Ответить с цитированием
Старый 14.10.2010, 22:24   #2
xPAL
Пользователь
 
Регистрация: 13.01.2008
Сообщений: 34
По умолчанию

К тому, что вызывает эту функцию(если правильно понял вопрос). Иногда пишут (*this).ptr(или this->ptr), чтобы подчеркнуть это

Последний раз редактировалось xPAL; 14.10.2010 в 22:34.
xPAL вне форума Ответить с цитированием
Старый 15.10.2010, 00:48   #3
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию

А почему тут
Код:
  String d = a + b + c;
не вызывается оператор присваивания ?
и сразу второй вопросик задам
Код:
	String(char* s){
		    cout << "Vizivaetsja konstruction" << endl;
		    int n = strlen(s);
            ptr = new char[n + 1];
            strcpy(ptr, s);
	}
Здесь создается временный объект. Вообще как узнать что здесь будет создан временный объект ?

Последний раз редактировалось Lotles; 15.10.2010 в 01:00.
Lotles вне форума Ответить с цитированием
Старый 15.10.2010, 01:19   #4
_ILYA_
Пользователь
 
Аватар для _ILYA_
 
Регистрация: 12.10.2010
Сообщений: 79
По умолчанию

Цитата:
Сообщение от Lotles Посмотреть сообщение
А почему тут
Код:
  String d = a + b + c;
не вызывается оператор присваивания ?
и сразу второй вопросик задам
Код:
	String(char* s){
		    cout << "Vizivaetsja konstruction" << endl;
		    int n = strlen(s);
            ptr = new char[n + 1];
            strcpy(ptr, s);
	}
Здесь создается временный объект. Вообще как узнать что здесь будет создан временный объект ?
Про какой временный объект ты говоришь?
В данном случае я вмжу что ты инициализируеш уже сушествующий
Код HTML:
 ptr = new char[n + 1];
Имею хитрый план по личному обогащению
_ILYA_ вне форума Ответить с цитированием
Старый 15.10.2010, 03:05   #5
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию

Код:
    a = "I ";
Сначала неявно создаётся временный объект при помощи конструктора String(const char* s), и потом уже идет присвоение

Цитата:
Сообщение от _ILYA_ Посмотреть сообщение
Про какой временный объект ты говоришь?
В данном случае я вмжу что ты инициализируеш уже сушествующий
Код HTML:
 ptr = new char[n + 1];
Код:
    a = "I ";
Сначала неявно создаётся временный объект при помощи конструктора
Код:
String(const char* s)
, и потом уже идет присвоение

Последний раз редактировалось Stilet; 15.10.2010 в 19:56.
Lotles вне форума Ответить с цитированием
Старый 15.10.2010, 11:49   #6
xPAL
Пользователь
 
Регистрация: 13.01.2008
Сообщений: 34
По умолчанию

Код:
String a, b, c;//тут вызывается конструктор String()
    a = "I ";
    b = "am ";
    c = "so ";
    String d = a + b + c;//Вызов конструктора копирования
cout << d << endl; //а #include <iostream> нету...
Цитата:
Сообщение от Lotles Посмотреть сообщение
Код:
    a = "I ";
Сначала неявно создаётся временный объект при помощи конструктора
Код:
String(const char* s)
, и потом уже идет присвоение
Объект уже создан,см String a, b, c;. Просто используется operator=
Можно было написать так:
Код:
String a( "I "), b("am "), c("so "), d = a + b + c;cout << d << endl;
Тут при создании a,b,c вызывается конструктор String(const char* s)

Последний раз редактировалось xPAL; 15.10.2010 в 12:01.
xPAL вне форума Ответить с цитированием
Старый 15.10.2010, 16:02   #7
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию

Код:
    String a, b, c;
    a = "I ";
Вы говорите вызывается
Код:
	String(){
		ptr = new char[1];
        ptr[0] = '\0';
	}
потом
Код:
    String& operator=(const String& src){
		cout << "Vizivaetsja operator prisvaivanija" << endl;
		cout << "src.ptr = " << src.ptr << endl;
		cpy(src.ptr); 
		return *this;
	}
Тут
Код:
String& operator=(const String& src){
Заместо operator= подставляется объект а, а заместо src...если по-вашему, поэтому я и говорю что временный объект должен быть или
как ...
Lotles вне форума Ответить с цитированием
Старый 15.10.2010, 17:31   #8
xPAL
Пользователь
 
Регистрация: 13.01.2008
Сообщений: 34
По умолчанию

Кажется, разобрался:
String(char* s) это у вас конструктор преобразования.В a = "I "; сначала вызывается этот конструктор, потом экземпляр a класса String вызывает operator=; operator= знает, из какого экземпляра класса он вызывается(благодаря неявному *this). Никаких временных объектов при этом не создается. Оператор преобразования возвращает, оператор = принимает
xPAL вне форума Ответить с цитированием
Старый 15.10.2010, 19:48   #9
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию

так когда вызывается оператор присваивания в src что передается
Lotles вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++. Классы. bashkan-nik Помощь студентам 3 08.12.2009 10:36
классы elenSV Общие вопросы C/C++ 0 31.05.2009 09:48
Классы Sasuke-sama Общие вопросы C/C++ 8 30.05.2009 15:15
Классы StudentPolitech Общие вопросы C/C++ 2 27.05.2009 22:44