C ++中的对象声明

时间:2015-06-17 06:09:10

标签: c++ object constructor

我对c ++中的以下代码有两个问题。

  1. A obj()中的main()行是什么意思?它没有给出任何错误。

  2. 为什么下一行obj.fun();会出现以下错误?

      

    请求'obj'中的成员'fun',这是非类型'A()'

  3. 代码是:

    #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;
    }
    

4 个答案:

答案 0 :(得分:8)

这是一个非常棘手的问题,但您实际上将obj声明为函数,它不接受任何参数并返回A的实例。

更改为

A obj;

如果您有一个支持C ++ 11的编译器(现在大多数情况下,除非您运行旧版本,但有些需要特殊标志才能启用它),那么您也可以这样做

A obj{};

答案 1 :(得分:1)

除了@Joachim Pileborg的回答之外,还有一些正式的解释:
N3936 :: 6.8.1 [stmt.ambig]:

  

涉及表达式语句的语法含糊不清   和声明:具有函数样式的表达式语句   显式类型转换(5.2.3),因为它最左边的子表达式可以   与第一个声明者开始的声明无法区分   (a。在这些情况下,声明是声明。[注意:To   消除歧义,整个声明可能需要进行审查   确定它是表达式语句还是声明。这个   消除许多例子的歧义。 [例子:假设T是a   simple-type-specifier(7.1.6),

     

T(a) - > m = 7; //表达式语句
  T(一)++; //表达式语句
  T(a,5)&lt;&lt; C; //表达式语句

     

T(* d)(INT); //声明
  T(E)[5]; //声明
  T(f)= {1,2}; //声明
  T(* G)(双(3)); //声明

     

在最后一个例子中   在上面,g,它是指向T的指针,被初始化为double(3)。这个   由于语义原因,当然是不正确的,但这并不影响   句法分析。 - 例子]

基本上,在C ++(和C)中,如果一段代码可以解释为 声明,它将是。

答案 2 :(得分:0)

A obj();

说你正在声明一个返回A对象的函数,并且没有任何参数。

要创建class A对象,只需编写

即可
A obj;

给出here

的解释
  

这是因为空的括号组将构成rectc a   函数声明而不是对象声明:它将是一个   不带参数的函数,返回一个type值   矩形。

答案 3 :(得分:0)

在此代码中,实际错误位于A obj(), 相反它应该是A obj;

  1. obj是类的对象,所以它不应该跟随大括号。当程序从main()开始执行时,A obj创建类A的对象。创建对象时,将调用该对象所属的类的构造函数,并打印“构造函数”。类似地,当控件移出main()时,将调用析构函数并打印“析构函数”。

  2. func()是一个函数,因此它应该跟随大括号。