#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有什么问题?预先感谢。
答案 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的实例正确访问了静态变量。