[解決済み] 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 *myname
対
string &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;
}
基本的に、参照を返すものが実際に有効であることを確認するのは、あなたの責任です。
関連
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】Enterキーを押して続行する
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない