Как работает ссылка?

210
21 марта 2018, 05:33

Друзья, помогите джуну в C++! Когда пишем

char *str = "Hello";

То мы создаем указатель на первый символ в этой строке? Тогда почему в cout << str; выводится вся строка, а не адрес первого символа?

Answer 1

Потому, что существует перегруженная версия оператора << для char * которая интерпретирует указатель на char как строку в стиле C.

Если вы хотите вывести на печать адрес первого элемента массива, то нужно воспользоваться версией <<, которая не интерпретирует операнд как строку:

std::cout << (void *) str << std::endl;
Answer 2

Для char* возможно определить operator << так, чтобы в поток вводить все символы:

ostream& operator <<(ostream& os, const char* p)
{
    while (*p != '\0')
        os << *p++;
    return os;
}

в стандарте такое определение какраз и существует, но для других типов это невозможно, потому что в таком случаи нужно передать еше и размер, так как у других типов массив не ограничен специальным символом, но размер не можем передать, постольку поскольку этот оператор имеет 2 аргумента ("третий лишный").

Для эксперимента, вы можете определить свою версию, если уверены, что ваш указатель укажет на строку с более чем двух символов

#include <iostream>
using namespace std;
ostream& operator <<(ostream& os, const char* p)
{
    while (*(p + 2) != '\0')
        os << *p++;
    return os;
}
int main()
{   
   const char* str= "hello";  //Да, именно  const char*, а не  char*  
   cout << str; // выдаст "hel", т.е. на 2 символа меньше
    return 0;
}
READ ALSO
Работа с бинарным деревом

Работа с бинарным деревом

Дано бинарное дерево,рандомно было записано данныеДалее необходимо удалить все простые числа

199
can&#39;t find linker symbol for virtual table for `ClassName`

can't find linker symbol for virtual table for `ClassName`

Есть класс ClassName который определен в динамической библиотеке, и который используется в исполняемом файлеВо время выполнения возникает ошибка

137