3

私はプログラミングをしていて、C++ クラスで奇妙な動作を見つけました。そこで、文字列、そのクラスのコンストラクター、およびオブジェクトから文字列を出力するフレンド メソッド (show) を含む単純なクラスを作成しました。しかし、メイン関数でわかるように。method(show) 単純な文字列に渡すと機能します。便利だと思いましたが、メソッドのパラメーターがオブジェクトへの参照である場合、なぜ機能するのでしょうか?

#include <iostream>
using namespace std;

class lol
{
  char * str;
public:
  lol(const char * s);
  friend void show(const lol & l);
};

lol::lol(const char * s)        //assign string to object
{
  str = new char[strlen(s)+1];
  strcpy(str,s);
}

void show(const lol & l)        //prints string from object
{   
  cout << l.str;
};

int main()
{
  show("TEST"); //passing string but not an object
  return 0;
};
4

1 に答える 1

9

便利だと思いましたが、メソッドのパラメーターがオブジェクトへの参照である場合、なぜ機能するのでしょうか?

これは、lolクラスが を受け入れるコンストラクターを定義し、としてマークされてconst char*ないexplicitため機能します。

show("TEST")これにより、 type の一時オブジェクトを構築しlol、文字列リテラルを引数としてコンストラクターに渡し、"TEST"参照引数lをこの一時オブジェクトにバインドすることにより、コンパイラーが呼び出しを解決することが許可されます。

この種の暗黙的なユーザー定義の変換シーケンスを防ぐには、コンストラクターを次のようにマークしますexplicit

class lol
{
    char * str;
public:
    explicit lol(const char * s);
//  ^^^^^^^^
    friend void show(const lol & l);
};

この方法では、呼び出しshow("TEST") によってコンパイラ エラーが発生します

于 2013-03-28T19:09:55.503 に答える