• ベストアンサー

C言語でのconstを返す関数

お世話になります。 C言語では、const の関数というのを認めているようですが、どうも使い方が分かりません。 const int foo() {  これは通常のint foo()とどのように違うのでしょうか。  よろしくお願いいたします。

  • annyG
  • お礼率70% (67/95)

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8520/19368)
回答No.2

constな値を返す関数で、唯一、意味があるのは const char *DayOfWeek(int Day) { switch (Day) { case SUNDAY: return "Sunday"; case MONDAY: return "Monday"; (以下略) のような「(静的メモリにある)固定の値を返す関数」のみ。 返されたポインタは「constな文字列」なので、返り値はconst char *になります。 この他「構造体のポインタを返すが、ユーザーが、その構造体を書き替えてはいけない場合」にも、関数を「const struct タグ名 *を返す」として定義します。 例えば、システムのプロパティを返す関数とかでは、返されたポインタの構造体を書き変えてもシステムのプロパティが変更される訳じゃないから、返されたポインタの中身を書き変え出来ないよう、constな構造体のポインタを返す、と宣言したりします。 >これは通常のint foo()とどのように違うのでしょうか。 何も違いません。同じです。 1つだけはっきりしてるのは「ポインタを返す関数に付けないと、constは意味が無い」と言う事です。

annyG
質問者

お礼

ご丁寧なご説明、ありがとうございました。 非常に良く解りました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「なにも違わない」はず. ちなみにそれは「const な値を返す」とは言わない>#2. 「返している値」そのものは const になっていない.

annyG
質問者

お礼

なるほど。つまり、静的な値を返すときだけではなく、constで宣言された変数のポインタを返すときなどもこのようにするということでしょうか。 ありがとうございました。

noname#208124
noname#208124
回答No.1

ほとんどの場合無意味で無効果

annyG
質問者

お礼

ご回答ありがとうございました。 すっきりしました。

関連するQ&A

  • C言語におけるポインターとconstの関係について

    C言語について質問があります。 1. int **p; const int **p1 = p; //型に互換性がないという警告 2. int *p; const int *p1 = p; //OK 上記2パターンありますが、なぜ1のパターンだと警告がでて、2のパターンだと警告が出ないのでしょうか? コンパイラはgccの4系列と3系列で試してみましたが同じ結果になりました。 constで修飾されていても、変数の内容を変更できるかできないかだけで、型情報には影響を与えないと考えておりましたが、実際に警告がでてしまい、疑問に思っております どなたか分かる人がいましたら教えていただけないでしょうか?

  • main の引数には const 付けた方が

    C言語での質問です。 引数を取るような main 関数は int main( int argc, char *argv[]){~} とされていますが、argvの指す文字列を変更する、というのはいくら何でもまずいので、 int main( int argc, const char *argv[]){~} あるいは int main( int argc, const char const * const * argv){~} の方がいいのではないでしょうか? 何故、constを付けない形が出回っているのでしょうか?

  • メンバ変数が変更されそうなconstメンバ関数

    c++のconstメンバ関数についての質問です。 以下のコードの様に、constメンバ関数で メンバ変数を変更しているように見える場合、 本来はどのように記述すべきか? class foo { public: foo(){} foo(int i){ d = i; } void hoge(foo *dest0, foo *dest1 ) const { dest0->d = d*2; dest1->d = d*4; } int d; }; int main() { foo f(1); foo p,q; f.hoge(&p,&q); std::cout << f.d << "\n"; std::cout << p.d << "\n"; std::cout << q.d << "\n"; f.hoge(&f,&q); std::cout << f.d << "\n"; std::cout << q.d << "\n"; return 0; } ちなみに出力期待値は 1 2 4 2 4 とします。 上のコードは 1 2 3 2 8 と出力されますが、このようなことが無いように実装するには どうすべきかという質問です。 dest0->d = d*2; dest1->d = d*4; の所を int i=d; dest0->d = i*2; dest1->d = i*4; とすべき? それともhogeの最初に if( (this == dest0) || (this == dest1) || (dest0== dest1) ){ throw "同じオブジェクトじゃだめ"; } とすべき? どんな書き方が安定でしょうか?

  • const int&の戻り値について

    const int&の戻り値について c++で「const int&(const int a)const{...」についてのメンバ関数がありますが、そのconst int&はどういう意図に使われるのでしょうか。 &があるので、アドレスを返すと思いますので、ポインタ変数に入れるだけでしょうか。それでもポインタ変数とメンバ関数の戻り値のアドレスは違うのはどういうことでしょうか。 主な使い用途がありましたら、教えてください。

  • メンバ関数にconstをつけた際の問題

    C++を勉強中の学生です。 以下のようなコードで問題が起こりました。 class TEST{ private: int mArray[10]; //(int a;) public: int* get_mArray(void) const; //(int get_a(void) const;) }; int* TEST::get_mArray(void) const{ return mArray;    //配列の先頭要素の値を受け取りたい。 } //(関係のありそうな部分のみを抜き出しました) このコードにおいて、関数は値を変えない事が明白なので、constをつける必要性はないのですが(癖でつけた際に発生した問題です)、 なぜconstをつけると動作しなくなるのか知りたいです。 //()で囲った部分を有効にし、 int TEST::get_a(void) const{return a;}という関数はエラーにならなかったのですが、どのような違いがあるのでしょうか? 出たエラーは(visual C++ 2010) 'const int [10]' から 'int *' に変換できません。 というものでした。 ポインタとconst関連の部分を手持ちの本で勉強しなおしたのですが、解答を得られなかったのでこちらで質問させてもらいます。

  • C++の const int* dataを置き換える C#

    C#2005で、C++の const int* dataを置き換えるにはどうしたらよいでしょうか? メソッドの引数でdataを渡しているのですが、dataは intの配列です。 メソッド内では書きかえられたくないのでC++の時にconstを付けました。 C#ではどのように記述するのが正しいでしょうか? C++からC#に置き換えていますが、参考になるサイトがありましたら教えてください。

  • C言語について、constの使用方法を教えてください。

    C言語の初心者です。 constの仕様について教えてください。 1.char *const p1; 2.const char *const p2; 以上のうような、指定され方があるとします。 p1,p2では何が違うのでしょうか? 1.では、char型がconst 2.では、p2はconst char型を示すポインタがconst というのまでは理解できたのですが、この結果、p1とp2は何が異なるのでしょうか。 p1,p2はconstされていると思いますが、p2のようにすることでの相違点を教えてください。 調べたのですがすっきりいきません。よろしくお願いします。

  • C++言語 メンバ関数

    何気なく使用しているクラスのメンバ関数、これの中身が実際どうなってるか知りたいです。大別して2種類に分かれますので以下の2つを 教えて下さい。また詳しく載っているサイトなどあれば教えて下さい。 1,stringクラスMid(int start,int length関数と operator関数+について class String{ char *p; char *q; public: //各定義 }; String String::Mid(int start,int length) const { // } String String::operator+(const String&s)const{ return String(p+s.q+s.p); } 最初の方はイメージもつかず、2つめのほうはポインタに ポインタを加えようとしましたとでます。 教えて下さい。

  • constのついたメンバ関数

     こんにちは。 C++を勉強しているのですが疑問に思ったことがあります。 const指定したメンバ関数にメンバ変数の変更をすることはエラーになるはずなんですが、 下記にある(*m_pRefCnt)++; はコンパイルが通るようです。 なぜこの一文だけ通るのでしょうか? 以下にソースを添付しておきます。 #include <iostream> class hogeClass { private: int* m_pRefCnt; int val; void AddRef() const { (*m_pRefCnt)++; // これはOK? val = 100; // これは駄目 } void Release() { } public: explicit hogeClass(char* src = NULL) : val(0) { } int& GetRefCnt() { return *(m_pRefCnt); } virtual ~hogeClass() { Release(); } }; int main() { int c = 435, k = 222; using namespace std; hogeClass a; getchar(); return 0; } 分かる人がいたらよろしくお願いします。

  • C言語について

    C言語を学習しています。 入門レベルの知識しか有りません。 <演習問題>  要素数nの配列v内のkeyと等しい全要素の添字を配列idxに格納する  関数search_idxを作成せよ。  返却するのはkeyと等しい要素の個数とする。   int search_idx(const int v[], int idx[], int key, int n); 例えば、vに受け取った配列の要素が{1,7,5,7,2,4,7}でkeyが7で     あれば、idxに{1,3,6}を格納した上で3を返却する。 というのが有るのですが、上手くプログラムが組めません。 ソースコードを伝授して頂けたら有難いです。

専門家に質問してみよう