2013-07-07 3 views
0

Примечание. Я новичок, и это мой первый вопрос о S.Overflow.Должен ли я создавать объект для вызова методов класса, или я могу просто ввести имя класса?

Я тестирую ограничения и пытаюсь более четко понять весь этот синтаксис программирования.

Когда я пытаюсь создать и запустить это, это не сработает. Зачем создавать объект, когда я могу просто ввести имя класса?

ответ

2

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

#include <iostream> 
#include <string> 
using namespace std; 

class Sayings{ 
    public: 
     static void coolSaying(){ 
      cout << "Preachin to the choir" << endl; 
     } 
}; 

int main() 
{  
    Sayings::coolSaying();  
} 

И как образец полезности экземпляров класса:

#include <iostream> 
using namespace std; 

class Sayings{ 
    public: 
     Sayings(const std::string & saying) : saying_(saying) { 
     } 

     void coolSaying(){ 
      cout << saying_ << endl; 
     } 
    private: 
     std::string saying_; 
}; 

int main() 
{  
    Saying s1("Preachin to the choir"); 
    Saying s2("Cool story bro"); 
    s1.coolSaying(); 
    s2.coolSaying(); 
} 
1

Да, вы должны иметь экземпляр класса для того, чтобы вызывать его не-статические функции. Если вы хотите вызвать участников без экземпляра класса, они должны быть объявлены как статические.

class Sayings 
{ 
    public: 
     // static member function. Can be called without having an instance 
     // of Sayings 
     static void coolSaying() 
     { 
      cout << "Preachin to the choir" << endl; 
     } 

     // non-static member function. Requires an instance of Sayings 
     // to be called. 
     void anotherCoolSaying() 
     { 
      cout << "Preachin to the pulpit" << endl; 
     } 
}; 

int main() 
{ 
    Sayings::coolSaying(); 

    Sayings s; 
    s.anotherCoolSaying(); 
} 
0

Нестатические функции-члены класса вызываются с объектом класса с помощью оператора точки . Поэтому вам нужно сначала создать объект класса с помощью соответствующего конструктора класса:

Sayings s; //create an object of class using default constructor 
s.coolSaying(); //call methods 

статические функции-члены вызываются с именем класса, за которым следует разрешения области видимости оператора :::

Sayings::coolSaying(); //For this to work you need the following: 

class Sayings{ 
public: 
    static void coolSaying(){ 
    //^^^ 
     cout << "Preachin to the choir" << endl; 
    } 
}; 
0

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

Другим вариантом является просто написать функцию вне класса полностью, если она вообще не взаимодействует с классом.

1

Причина, по которой требуется экземпляр класса, хорошо, если класс имеет «состояние». Класс имеет состояние, если он имеет переменные-члены, которые меняются со временем, тогда вам понадобится экземпляр этого класса для вызова (нестатических) функций-членов. С другой стороны, если класс не имеет статуса (или если метод не влияет на состояние объектов этого класса, то есть он не изменяет переменные-члены), вы можете сделать его статической функцией-членом. Статические функции-члены не требуют экземпляра класса для вызова.

#include <iostream> 

class Widget 
{ 
public: 
    Widget(): x(0) {} // constructor with initialization list 
    void setX(int newVal) { x = newVal; } // changes the state of an instance 
    void printX() { std::cout << x << std::endl; } // interacts with the state of an instance 

    static void printClassName() { std::cout << "Widget" << std::endl; } // doest change or interact with the state therefore can be made static 
private: 
    int x; 
}; 

int main(int argc, char* argv[]) 
{ 
    Widget w; 
    w.printX(); 
    w.setX(4); 
    w.printX(); 
    Widget::printClassName(); 
    //w::printX(); <-- this won't compile because it is not static 

    return 0; 
} 

Как вы можете видеть here, выход: Widget

0

Цитируя стандарта C++

A non-static member function may be called for an object of its class type, or for an object of a class derived (clause 10) from its class type, using the class member access syntax (5.2.5, 13.3.1.1). A non-static member function may also be called directly using the function call syntax.

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