joynter |
Отправлено: 25.11.2004, 11:39 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 137
|
наткнулся тут на такую штуку:
если написать
CODE |
char a[]="aaa";
char b[]="bbb";
AnsiString s = a+b;
|
то компилятор скажет : неправильное сложение указателей.
а если так
CODE |
char a[]="aaa";
char b[]="bbb";
AnsiString s = IntToStr(NULL)+a+b;
|
то никаких ошибок нет.
что же здесь на самом деле происхдит? |
|
Konstantine |
Отправлено: 25.11.2004, 11:46 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
потому как строка символов — это указатель... а для класса AnsiString сделана операция такая, что если к нему прибавить указатель на строку, то к строке класса добавится строка, на которую указывает указатель.
для программ лучше так не писАть вообще... лучше так:CODE | AnsiString a="aaa";
AnsiString b="bbb";
AnsiString s = a+b; | хотя... возможны варианты от программы...
|
|
Guest |
Отправлено: 25.11.2004, 12:11 |
|
Не зарегистрирован
|
Такого же эффекта можно добиться так
AnsiString c = AnsiString("") + a + b;
Происходит неявное приведение типа по первому слагаемому, а в оригинале (где a + не происходит.
Писать можно как угодно, главное самому понимать написаное |
|
Konstantine |
Отправлено: 25.11.2004, 12:18 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
ну если так, то ещё можно написать:CODE | AnsiString c = AnsiString("а") + b; | илиCODE | AnsiString с; (c += а) += b; | дело желания и фантазии
самое главное, чтоб первый операнд был типа AnsiString...
QUOTE | Происходит неявное приведение типа по первому слагаемому | ЭТО — не приведение типа, а создание объекта класса AnsiString и инициализация его строкое (в этом случае — пустой) и можно было б без "", так — AnsiString()
|
|
Guest |
Отправлено: 25.11.2004, 12:27 |
|
Не зарегистрирован
|
Приведение типа зачастую и порождает новый объект требуемого типа.
Уже и так сказано слишком много слов, чтобы сказать первый оператор должен быть AnsiString (чем ситуация отличается от double = double + int + char ?) |
|
joynter |
Отправлено: 25.11.2004, 12:28 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 137
|
ситуация была такая
дано:
CODE |
HWND hWnd;
char a[256];
char b[256];
AhsiString s;
...
GetClassName(hWnd,a,sizeof(a));
GetWindowName(hWnd,b,sizeof(b));
|
и надо было сформировать строку из hWnd, a и b.
s = IntToStr((int)hWnd + a + b; |
|
Guest |
Отправлено: 25.11.2004, 13:00 |
|
Не зарегистрирован
|
s = AnsiString(int(hWnd)) + ": " + a + "/" + b; |
|
Gedeon |
Отправлено: 25.11.2004, 13:14 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
2joynter Да, мы как всегда недочитываем хэлп и легких путей не ищем.
На Ваш первый вопрос Вам совершенно правильно ответил Konstantine. Уж если пользуетесь классом AnsiString, так и используйте правильно его возможности
CODE |
char *a = "aaa";
char *b = "bbb";
int i = 10;
AnsiString c = AnsiString(a) + AnsiString(b) + AnsiString(i); |
И еще раз уж используете С++ так разберитесь с тем, что есть указатель, обьект, ссылка.
|
|
olegenty |
Отправлено: 26.11.2004, 13:49 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
вот конкретно joynter'у просто ну очень надо прочитать Алега И. Глоуба. там всё вышеизложенное так приподробно изложено. хотя, в 3-м Страуструпе, наверное, тоже...
особенно впечатляюще ужасают неявные приведения типов... такое поле для выгуливания коров с целью наступания ногой в продукты их жизнедеятельности!!!
|
|