2015-06-17 2 views
0

У меня есть два вопроса о следующем коде в C++.Объявление объекта в C++

  1. Что линия A obj() в main() означает? Это не дает никаких ошибок.

  2. И почему следующая строка obj.fun(); дает следующую информацию?

    запрос члена 'забавной' в 'OBJ', который имеет тип неклассовую 'A()'

Код:

#include<iostream> 
using namespace std; 

class A{ 
    public: 
     A(){ 
      cout<<"Constuctor called\n"; 
     } 
     ~A(){ 
      cout<<"Destuctor called\n"; 
     } 
     void fun(){ 
      cout<<"YES"; 
     } 
}; 

int main(){ 
    A obj(); 
    obj.fun(); 
    return 0; 
} 

ответ

8

Это очень сложный, но вы фактически объявляете obj как функцию , которая не принимает аргументов и возвращает экземпляр A.

Изменения в

A obj; 

Если у вас есть C++ 11, способный компилятору (которые наиболее в эти дни, если вы не используете старую версию, хотя некоторые требуются специальные флаги, чтобы включить его), то вы могли бы также сделать

A obj{}; 
+3

Это означает, что любой объект как функция бесполезен для всей программы? –

+0

@ user3719247 Нет, это означает, что объявление функции, возвращающей объект типа при намеревании объявить экземпляр объекта, позже приведет к недействительности ссылок на этот экземпляр. – polarysekt

0
A obj(); 

Говорит вы объявляете функцию, вернуть объект а и не принимает никаких аргументов.

Чтобы создать объект class A просто написать

A obj; 

Объяснение дается here

Это происходит потому, что пустой набор скобок бы из rectc функции декларации вместо описания объекта в : Это была бы функция , которая не принимает аргументов и возвращает значение типа Rectangle.

+3

Я не собирался объявлять какие-либо объекты. Я просто подумал, что если я буду следовать() с объявлением объекта. :) –

+0

не уверен, но если хотите, вы можете прочитать о 'вложенной функции' или' выражение функции extern' тоже .. – HadeS

0

В этом коде фактическая ошибка заключается в A obj(), вместо этого он должен быть A obj;

  1. obj является объектом класса, поэтому он не должен следовать за скобки. A obj создает объект класса A, когда программа запускает выполнение из main(). Когда объект создается, вызывается конструктор класса, к которому принадлежит объект, и печатается «конструктор». Аналогично, когда управление выйдет из main(), будет вызываться деструктор и будет напечатан «деструктор».

  2. func() - это функция, поэтому она должна следовать за фигурными скобками.

0

Некоторые формальные объяснения в дополнение к ответу @Joachim Pileborg в:
N3936 :: 6.8.1 [stmt.ambig]:

Существует неопределенность в грамматике с участием выражения-высказывания и декларации: выражение expression с выражением типа функции Явное преобразование типа (5.2.3) как его самое левое подвыражение может быть неотличимым от объявления, в котором первый декларатор запускает с (в этом случае утверждение является объявлением. Не e: To disambiguate, весь запрос, возможно, придется изучить до , определить, является ли это выражением-выражением или декларацией. Этот неоднозначает множество примеров. [Пример: предполагается, что T является спецификатором простого типа (7.1.6),

T (a) -> m = 7; // выражение-оператор
T (a) ++; // выражение-выписка
T (a, 5) < < c; // выражение-заявление

T (* d) (int); // декларация
T (e) [5]; // Объявление
T (f) = {1, 2}; // декларация
T (* g) (double (3)); // Объявление

В последнем примере выше, g, являющийся указателем на T, инициализируется двойным (3). Этот , конечно, плохо сформирован по смысловым соображениям, но это не влияет на синтаксический анализ . -end пример]

В принципе, в C++ (и C), если часть кода, может быть интерпретирована как декларации, то это будет.

Смежные вопросы