классовые и статические переменные - PullRequest
0 голосов
/ 25 октября 2018
#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 ++ и сейчас учусь в классе.Мне просто интересно, почему я могу распечатать только последний (аа)?Какие проблемы у Аа и А?Заранее спасибо.

Ответы [ 5 ]

0 голосов
/ 25 октября 2018
    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 

Таким образом, вы должны использовать перегрузка вставки потока в c ++ для преодоления этого.

Наконец,

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

Более того, это статический атрибут (совместно используемый другими объектами). Изменения, внесенные в это отношение кхарактеристики других объектов. Ссылка это

Последнее предложение - обратиться к хорошей книге концепций упс.

0 голосов
/ 25 октября 2018

В опубликованном вами коде:

 cout<<A.a<<endl;

Вышеуказанная строка синтаксически некорректна, вы должны написать ее как A::a

cout<<a<<endl;

Выше строка пытается отменить ссылкуобъект (экземпляр класса A) и компилятор не знает, как печатать.

 cout<<a.a<<endl;

Это печатается, потому что здесь вы правильно обращаетесь к статической переменной через экземпляр класса A.

0 голосов
/ 25 октября 2018

A.a недопустимо, поскольку левый операнд оператора точка должен быть объектом, а не типом.A::a будет допустимым синтаксисом для этого.

std::cout<<a; фактически переводит в вызов функции std::ostream& operator<<(std::ostream& out,[can be const] A& a), и его нет, поэтому компилятор не знает, как печатать объект типаA.Вы можете реализовать эту функцию, например:

std::ostream& operator<<(std::ostream& out,const A& a)
{
    out<<"Hello, I'm object A\n";
    return out;
}
0 голосов
/ 25 октября 2018

В чем проблемы для Aa и 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;
}

, тогда этот код в основном будет работать:

std::cout << a;
0 голосов
/ 25 октября 2018

У вас есть экземпляр A, который вы назвали a.

Первая строка синтаксически неверна, потому что вы хотите получить доступ к статическому полю через тип.В C ++ написано A::a.

. Во второй строке вы хотите напечатать экземпляр A, а не содержимое его поля.Поскольку вы не определили способ печати экземпляра A, сборка завершится неудачно.(Думаю, вы увидите потоки позже).

И, в конце концов, с последней строкой все в порядке, поскольку вы также можете обращаться к статическому полю с помощью экземпляра.

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