0

注意 - 我是新手,这是我关于 S.Overflow 的第一个问题。

我正在测试这些限制,并试图更清楚地理解所有这些编程语法。

当我尝试构建和运行它时,它不起作用。当我可以输入类名时,为什么要创建一个对象?

#include <iostream>
using namespace std;

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

int main()
{

Sayings.coolSaying();


}
4

6 回答 6

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();
}
于 2013-07-07T04:32:47.137 回答
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();
}
于 2013-07-07T04:33:09.980 回答
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;
}

正如你在这里看到的,输出是:0 4 Widget

于 2013-07-07T04:39:47.723 回答
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;
    }
};
于 2013-07-07T04:33:40.577 回答
0

这样想……如果数据不存在,让函数修改数据是否有意义?正如其他人所提到的,如果你想要一个函数只是做与类的成员变量无关的事情,一个可行的选择是只使用一个静态方法。

另一种选择是完全在类之外编写函数,如果它根本不与类交互。

于 2013-07-07T04:35:32.990 回答
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.

于 2013-07-07T04:40:29.533 回答