1. ホーム
  2. c++

[解決済み] C++の宣言で'&'は何をするのですか?

2022-03-01 07:08:52

質問

私はC言語の人間なのですが、あるC++のコードを理解しようとしています。次のような関数宣言があります。

int foo(const string &myname) {
  cout << "called foo for: " << myname << endl;
  return 0;
}

関数シグネチャは、同等のCとどう違うのか。

int foo(const char *myname)

を使用するのとでは、何か違いがあるのでしょうか? string *mynamestring &myname ? とはどのような違いがあるのでしょうか? & C++の * は、ポインターを示すためにC言語で書かれたものですか?

同様に

const string &GetMethodName() { ... }

とは何ですか? & はここで何をしているのでしょうか?どのようにするか説明しているウェブサイトはありますか? & はCとC++で使い方が違うのでしょうか?

どのように解決するのですか?

は、オブジェクトへのポインタではなく、参照を表します。

などの関数があるのが利点です。

foo(string const& myname) 

以上

foo(string const* myname)

前者の場合、C++はNULL参照を許さないので、mynameが非NULLであることが保証されています。参照渡しなので、ポインタを渡すときと同じように、オブジェクトはコピーされません。

2つ目の例です。

const string &GetMethodName() { ... }

これにより、例えばメンバ変数への定数参照を返すことができるようになります。これは、コピーを返したくない場合や、返された値が非NULLであることが保証される場合に便利です。例として、次のようにすると、直接、読み取り専用でアクセスすることができます。

class A
{
  public:
  int bar() const {return someValue;}
  //Big, expensive to copy class
}

class B
{
public:
 A const& getA() { return mA;}
private:
 A mA;
}
void someFunction()
{
 B b = B();
 //Access A, ability to call const functions on A
 //No need to check for null, since reference is guaranteed to be valid.
 int value = b.getA().bar(); 
}

もちろん、無効な参照を返さないように注意する必要があります。 コンパイラは以下のようなものを喜んでコンパイルするでしょう(警告のレベルや警告の扱い方によりますが)。

int const& foo() 
{
 int a;

 //This is very bad, returning reference to something on the stack. This will
 //crash at runtime.
 return a; 
}

基本的に、参照を返すものが実際に有効であることを確認するのは、あなたの責任です。