类和静态变量

时间:2018-10-25 15:57:18

标签: c++ static

#include <iostream>
using namespace std;
class A {
public:
    static int a;
    A() {a=1;a++;}

};
int A::a =1;

int main(void){
 A a;

 cout<<A.a<<endl;
 cout<<a<<endl;
 cout<<a.a<<endl;


 return 0;
 }

我是C ++的初学者,现在正在学习课程。我只是想知道为什么我只能打印出最后一个(a.a)? A.a和a有什么问题?预先感谢。

5 个答案:

答案 0 :(得分:1)

  

A.a和a有什么问题?

A是一种类型,但是运算符.仅适用于对象(或对它们的引用)。如果要访问静态变量,请使用其他语法:

std::cout << A::a;

关于std::cout << a不起作用的原因,std::ostream不知道如何输出类A的实例,您可以为此创建自己的运算符:

std::ostream &operator<<(std::ostream &out, const A &a )
{
   return out << a.a;
}

然后此main中的代码将起作用:

std::cout << a;

答案 1 :(得分:1)

    cout<<A.a ;//invalid in c++ but valid in java and 
               //some other languages  

不是有效的语法,您必须使用A :: a(发音为范围解析(在A类的范围内))

   cout<<A::a ;//valid in c++

 cout<<a; //Here a is an instance that has some 
          //characteristics 

因此,您必须使用stream insertion overloading in c++来克服这一点。

最后,

        cout<<a.a; //well and good as it an attribute of class A.

此外,它是一个静态属性(由其他对象共享)。对其所做的更改反映了其他对象的特征。请参阅this

最后的建议是参考优秀的概念书。

答案 2 :(得分:0)

您有一个名为A的{​​{1}}实例。

第一行在语法上是错误的,因为您要通过类型访问静态字段。在C ++中,它写为a

在第二行上,您要打印A::a的实例,而不是其字段的内容。由于您未定义打印A实例的方法,因此构建失败。 (我猜您稍后会看到流)。

最后,最后一行很好,因为您也可以通过实例访问静态字段。

答案 3 :(得分:0)

$posts = Post::with('photo')->get(); 无效,因为点运算符的左操作数必须是对象,而不是类型。 A.a将是有效的语法。

A::a实际上转换为对函数std::cout<<a;的调用,并且没有一个,因此编译器不知道如何打印类型为std::ostream& operator<<(std::ostream& out,[can be const] A& a)的对象。您可以实现该功能,例如:

A

答案 4 :(得分:0)

在您发布的代码中:

 cout<<A.a<<endl;

以上行在语法上不正确,您应将其写为A::a

cout<<a<<endl;

上一行试图取消引用一个对象(A类的实例),并且编译器不知道如何打印。

 cout<<a.a<<endl;

之所以打印,是因为您在这里通过类A的实例正确访问了静态变量。