C ++ Вопрос о символьных строках и указателях - PullRequest
1 голос
/ 15 марта 2020

Я довольно новичок в C ++ и все еще пытаюсь понять указатели и когда они нужны или нет. Но на этот вопрос я искал создание файлов заголовков и классов. Моим первым «тестом» было просто создать класс, который может обрабатывать «Журналы». Итак, я сделал это.

Logger.h

#pragma once
#include <iostream>
using namespace std;

class Logger
{
    public:
        Logger();
        void logC(const char* message);
        void logCA(const char message[]);
        void logS(string message);
};

Logger. cpp

#include "Logger.h"

Logger::Logger() {

}

void Logger::logC(const char* message)
{
    cout << message << endl;
}

void Logger::logCA(const char message[])
{
    cout << message << endl;
}

void Logger::logS(string message)
{
    cout << message << endl;
}

А затем по своей основной функции я просто использую их вот так.

#include "Logger.h"

int main(){

    Logger myLogger;

    myLogger.logC("Hello");
    myLogger.logCA("Alo");
    myLogger.logS("Hola");

    cout << endl;
    system("pause");
    return 0;
}

Несколько вопросов здесь. Зачем мне использовать один метод над другими. А также, в методе const char *, почему это указатель на символ, он принимает массив символов в качестве действительного, а также, если он получает адрес в местоположение символа, почему вывод представляет собой весь массив, а не адрес памяти, на котором он включен. (И он также «знает», где остановиться, он не печатает с этого адреса и навсегда)

1 Ответ

1 голос
/ 15 марта 2020
void logC(const char* message);

Принимает указатель на буфер char. Это также известно как C -строка (до тех пор, пока она завершается нулем, то есть ваша, потому что это строковый литерал).

void logCA(const char message[]);

Точно так же . Не позволяйте [] обмануть вас: это буквально то же самое, что и const char* message. Это не потому, что массивы являются указателями: это не так. Это странная странность из C истории. Параметр функции с тем, что выглядит как «тип массива» без измерений, вместо этого обрабатывается как параметр указателя. Фу!

void logS(string message);

Принимает std::string. Они могут быть построены из C -строк, и это происходит за кулисами, когда вы передаете строковый литерал.

Что лучше? Это очень субъективно. Возможно, вы хотите const std::string_view, который может принять любой из них бесплатно. Но глубокое обсуждение различий здесь выходит за рамки; однако его можно найти в вашей книге.

он получает адрес для местоположения символа, почему выводом является весь массив, а не адрес памяти, на котором он

Потому что cout имеет специальное правило для char*, зная, что вы обычно хотите, чтобы с ними обращались как со строками, потому что вы это делаете. Вместо того, чтобы печатать значение указателя (адрес памяти), он разыменовывает это и печатает все символы в буфере, на который он указывает, заканчиваясь нулевым ограничителем. Это функция.

Если вы используете приведение к другому типу указателя, вы можете «отключить это», например, cout << (void*)message, теперь вы увидите адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...