Несколько сомнений относительно определения 1.constructor и 2.array во время компиляции - PullRequest
0 голосов
/ 12 августа 2011

Пожалуйста, помогите мне прояснить понятия со следующими проблемами: (выполнено и протестировано на linux, gcc)

Задача 1:

В следующем простом примере, что именно означает A a ()??

Я обнаружил, что это не определение конструктора по умолчанию, но a () - это функция с типом возврата, равным A.

Если это правильно, то почему этот код выполняетне дает мне никакой ошибки компоновщика или ошибки времени выполнения . Этот код работает и связывается гладко, как если бы он знал определение функции a ().

class A
{
  public:
     void print()
     {
       printf("In class A\n");
     }
};


int
  main()
  {
    A a();
    //a.fun();  //throws error "request for member ‘fun’ in ‘a’, which is of type ‘A()’"
  } 

задача 2.

В следующем коде определение массива b выдает ошибку.Я не могу найти точную причину такого поведения.

int a[]={3,4,21,5,7,86};
 int b[a[3]];     //this throws error why???

 int
  main() { ... }

Ответы [ 4 ]

2 голосов
/ 12 августа 2011

Задача 1

Это известно как самый неприятный анализ .Следующее:

A a();

- это объявление функции.Вы не вызываете эту функцию, поэтому компоновщик не обязан ее разрешать.Это объясняет, почему вы не видите никакой ошибки.

Проблема 2

Размер массива должен быть указан с помощью константного выражения .a[3] не является константным выражением.

1 голос
/ 13 августа 2011

A a(); Это говорит компилятору, что функция a существует. Компилятор говорит ОК! Но так как он никогда не ИСПОЛЬЗУЕТСЯ, компоновщик никогда не проверяет его, и поэтому нет ошибки компоновщика.

int a[]={3,4,21,5,7,86}; К сожалению, элементы массива не считаются compile time constants и поэтому не могут использоваться для инициализации массивов или параметров шаблона. Вам придется установить размер B другим способом или динамически во время выполнения: int *b = new int[a[3]];

0 голосов
/ 12 августа 2011

Относительно проблемы 2: c ++ не поддерживает переменный размер массива

0 голосов
/ 12 августа 2011
A a();

Это объявление функции с именем a, которое не принимает аргументов и возвращает A.Это не объявление переменной.


int a[]={3,4,21,5,7,86};
int b[a[3]];     //this throws error why???

В C ++ размер массива должен быть выражением const, но a[3] НЕ является выражением const.Отсюда и ошибка.

Однако, если вы сделаете это:

const int a=21;
int b[a];   //okay - now a is const expression.

Тогда все в порядке.

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