C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
AnsiString = char +char, глюки или что?
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 + cool.gif не происходит. smile.gif
Писать можно как угодно, главное самому понимать написаное smile.gif
Konstantine
Отправлено: 25.11.2004, 12:18


Мастер участка

Группа: Модератор
Сообщений: 545



ну если так, то ещё можно написать:
CODE
AnsiString c = AnsiString("а") + b;
или
CODE
AnsiString с; (c += а) += b;
дело желания и фантазии smile.gif
самое главное, чтоб первый операнд был типа 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-м Страуструпе, наверное, тоже...

особенно впечатляюще ужасают неявные приведения типов... такое поле для выгуливания коров с целью наступания ногой в продукты их жизнедеятельности!!! smile.gif

Вернуться в Вопросы программирования в C++Builder