2 вопроса для начинающих о c ++ - PullRequest
0 голосов
/ 25 февраля 2012

1.Какое использование -> для примера является test-> name, то же самое, что и test.name?

2. Для чего используются заголовочные файлы? Я привык к другому языку программирования, как Java, где вам нужен только 1 файл (файл класса). Нужно ли нам использовать заголовочный файл для объявления всех вещей?

Ответы [ 7 ]

4 голосов
/ 25 февраля 2012
  1. a->b совпадает с (*a).b, когда a является указателем.Это просто удобный синтаксис для одного и того же.Когда a является классом, он вызывает operator-> класса с a в качестве вызывающего объекта.Если вы этого не понимаете, тогда не беспокойтесь, когда вы продвинетесь дальше в C ++, у вас получится.
  2. Заголовочные файлы должны содержать объявления, в то время как .cpp файлы содержат определения.Они нужны вам, когда вы хотите написать функции, которые можно использовать из других файлов.Это потому, что вы можете иметь столько объявлений структуры (то есть переменной, функции, класса и т. Д.), Сколько вам нужно, но только одно определение этой структуры.Заголовочные файлы включаются в код во многих местах (для каждого файла, который должен использовать средства, предоставляемые его реализацией) и компилируются один раз для каждого включаемого в них файла .cpp, поэтому не стоит помещать что-либо, что у вас может быть только одноиз в заголовочном файле.Файлы реализации (файлы .cpp или .c) компилируются только один раз для всей программы, поэтому они являются подходящим местом для реализаций (вещи, которые вы можете иметь только в одной из них).Заголовочные файлы также облегчают разделение реализации и интерфейса.

Тем не менее, на все эти вопросы ответила бы хорошая книга по C ++, поэтому, пожалуйста, купите и прочитайте ее, прежде чем заходить слишком далеко.сэкономит много времени и головной боли.

1 голос
/ 25 февраля 2012

Хорошо, я постараюсь объяснить простым способом, чтобы новичку было легче понять.

  1. Да, это то же самое, что и точка, но оно используется для указателей.

    MyClass a;
    a.myMethod();
    
    MyClass* b = new MyClass;
    b->myMethod();
    delete b;
    

    И a, и b вызывают один и тот же метод, но a выделяется в куче, а b - это указатель, назначаемый новым. Выделенная память всегда должна быть освобождена (таким образом, оператор delete b). На самом деле это упрощение: стрелка разыменовывает указатель и вызывает над ним оператор точки. Если из-за этого у вас в голове кружится голова, просто примите простое объяснение, оно затонет позже, когда вы станете более восприимчивыми к языку.

  2. Заголовочные файлы не являются обязательными, но они полезны для ссылки на то, что было объявлено в модуле перевода в другом. Так, например, вы объявляете MyClass в заголовке, чем можете использовать его как в myfilea.cpp, так и в myfileb.cpp без особых усилий, чтобы объявлять его более одного раза.

    Чтобы правильно понимать заголовочные файлы, вам нужно знать, что при использовании таких выражений, как:

    #include "myheader.h"
    

    То, что делает препроцессор компилятора, копирует и вставляет все содержимое myheader.h в файл, который его включает. Поскольку компилятору необходимо знать о типах (обычно о классах), прежде чем разрешить вам их использовать, в каждом файле вам необходимо «переопределить, что такое типы». Фактически можно реализовать все внутри заголовочного файла, подобно тому, что будет выглядеть как код Java, затем в один файл main.cpp включить эти файлы, но тогда для компиляции кода потребуется гораздо больше времени, и будет сложнее следовать .

1 голос
/ 25 февраля 2012

1) Оператор «стрелка» -> равен не , как оператор ., но является ярлыком, когда вы используете указатели для структур вместо просто структур. См. это объяснение , например:

struct Point {
    int x;
    int y;
};

Point* p;      // p points to a Point struct

p = new Point;
p->x = 12;     // This is an useful shortcut for...
(*p).x = 12;   // .. this

2) Что касается заголовочных файлов, они не нужны, вы также можете добавить объявления в начале файла .c, но полезно разделять объявления и реальный код.

1 голос
/ 25 февраля 2012

structure->member

является эквивалентом

(*structure).member

, таким образом, это сокращение.Разыменовывает указатель structure и получает доступ к элементу member

0 голосов
/ 25 февраля 2012
  1. test->name полностью равно (*test).name, а не test.name
  2. Заголовки используются для включения одного и того же определения во многие единицы перевода, Java не использует их, поскольку определения никогда не требуются, все объекты используются указателями.

Посмотрите на этот пример:

class A
{
   B member;
};

Если вы не включите определение B, вы не сможете узнать размер класса A. В java member будет указателем, поэтому это бесполезно.

0 голосов
/ 25 февраля 2012
std::string str("foo");
std::string *str_p=new std::string("bar");   /
//Please use smart pointers in real code
std::cout <<  str.size() << "   " << str_p->size();

так что в основном -> задерживает указатель, чем доступ к члену типа.

Это тоже равно

(*str_p).size(); 

здесь str_p сначала разыменовывается вручную, затем размервызвана функция-член.

0 голосов
/ 25 февраля 2012

Я думаю, что вам нужно прочитать книгу на C ++ и C, '->' не то же самое, что '.'но почти и заголовочные файлы имеют отношение к компилятору и разметке памяти.C ++ гораздо больше относится к реальной машине, чем к Java, и к тому, что вам нужно думать о программировании немного по-другому.

Я рекомендую прочитать книгу Bjarne Staustrups на C ++ или хотя бы просмотреть ее.Если бы C ++ был просто Java с другим синтаксисом, не было бы никакой причины изобретать Java - у каждого языка есть свои приложения, и вам нужно понять, что это за язык, прежде чем начать его использовать.: -)

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