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

このように考えてください...そのデータが存在しない場合、関数でデータを変更することは理にかなっていますか? 他の人が述べたように、クラスのメンバー変数に関係のないことを関数に実行させたい場合、実行可能なオプションは静的メソッドを使用することです。

もう 1 つのオプションは、関数がクラスとまったく相互作用しない場合、関数を完全にクラスの外に記述することです。

于 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 に答える