質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1232閲覧

識別子の定義、変数の影響範囲

big000

総合スコア18

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/06/06 05:55

二つの文字列を合成し、その長さを求めるする機能を持つクラス、TwoStringsのヘッダファイルと、そのクラスを使ったプログラムを作れという問題

以下は、そのプログラム↓

//sample.h header #ifndef Two_String #define Two_String #include<string> #include<iostream> using namespace std; class TwoString { private: string str1; string str2; public: void set(string, string); int get(); int getconn(); int length(); }; #endif //sample.cpp #include "sample.h" void TwoString::set(string s1, string s2) { str1 = s1; str2 = s2; } int TwoString::get() { cout << str1 << endl << str2 << endl; return 0; } int TwoString::getconn() { string str3; str3= str1 + str2; cout << str3 << endl; return 0; } int TwoString::length() { cout<<((str1+str2).length())<<endl; return 0; } //main file #include "sample.h" int main() { TwoString obj; obj.set("Hello", "World"); obj.get(); obj.getconn(); obj.length(); return 0; } コード

実行結果 ↓
Hello
World
HelloWorld
10

【疑問に思った点は、sample.cpp のファイルで、cout<<((str1+str2).length())<<endlの部分で、】
『1』
(str1+str2)の部分を、(str3)とすると、識別子が定義されていないとエラーが起こることです。

これは、sample.hのclassのところで、private: string str3
と記述すれば、エラーは起きません。
『2』ただ、出力された文字数は、0となります。
そこで、
int TwoString::getconn() {
string str3;
str3= str1 + str2;
cout << str3 << endl;
return 0;

の部分の、string str3を削除すると、正しく記述されます。

『1』の部分では、同じsample.cppファイル内で、一つ前の、int TwoString::getconn()内で、str3を宣言していたが、これはローカル変数で、範囲外でエラーということでしょうか?

また『2』の部分では、先のローカル変数にも関わらず?
一度classsで宣言されて、グローバル化して、int TwoString::getconn() 内の宣言で、初期化or別の変数化した?

この変数の影響範囲の部分が、不明瞭です。教えていただきたいです。

次にJavaを学習しようと思っているのですが、この識別子や変数の理解は、プログラミングで重要な概念でしょうか?
答えや、この部分に関する参考文献を教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

『1』の部分では、同じsample.cppファイル内で、一つ前の、int TwoString::getconn()内で、str3を宣言していたが、これはローカル変数で、範囲外でエラーということでしょうか?

はい、関数内で宣言した変数はローカルスコープですので、関数の外からは使えません。

また『2』の部分では、先のローカル変数にも関わらず?

一度classsで宣言されて、グローバル化して、int TwoString::getconn() 内の宣言で、初期化or別の変数化した?

はい、ローカル変数とメンバ変数を同じ名前で宣言した場合、(this経由でメンバ変数をアクセスするのでなければ)ローカル変数のほうがアクセスされることになります。

次にJavaを学習しようと思っているのですが、この識別子や変数の理解は、プログラミングで重要な概念でしょうか?

はい、スコープを把握することで、より明快にプログラムを書くことが可能となります(もっとも、「同じ変数名でスコープ外と重複する」ようなものは、作らないに越したことはありません)。

投稿2019/06/06 06:09

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

『1』の部分では、同じsample.cppファイル内で、一つ前の、int TwoString::getconn()内で、str3を宣言していたが、これはローカル変数で、範囲外でエラーということでしょうか?

です。
他の関数内で定義されたローカル変数に、他の関数からはアクセスできません。

また『2』の部分では、先のローカル変数にも関わらず?

一度classsで宣言されて、グローバル化して、int TwoString::getconn() 内の宣言で、初期化or別の変数化した?

グローバル変数ではありません、クラスのメンバ変数です。
クラスのメンバ変数は同じクラスのメンバ関数内であればアクセス可能です。

C++ 変数のスコープあたりでググってもらえれば、説明はたくさん出てくるとおもうので、ここでは割愛します。読んで分からない事があればまた質問してください。

#ちなみに言語によっても変数のスコープは変わるので気をつけてください。

投稿2019/06/06 06:07

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

メンバ関数内で宣言した変数は、その関数内でのみ有効です。

『1』の部分では、同じsample.cppファイル内で、一つ前の、int TwoString::getconn()内で、str3を宣言していたが、これはローカル変数で、範囲外でエラーということでしょうか?

範囲外というのがスコープ外という意味なら、Yes。

『2』ただ、出力された文字数は、0となります。

std::stringの引数を取らないコンストラクタが呼ばれ、空文字に初期化されています。

また『2』の部分では、先のローカル変数にも関わらず?

一度classsで宣言されて、グローバル化して、int TwoString::getconn() 内の宣言で、初期化or別の変数化した?

メンバ変数のstr3とローカル変数のstr3が同居している状態です。
特に指定しなければ、ローカル変数の方が優先して参照されます。

C++

1int TwoString::getconn() { 2 string str3; 3 str3= str1 + str2; // <= このstr3はローカル変数

C++

1int TwoString::getconn() { 2 str3= str1 + str2; // <= このstr3はメンバ変数

次にJavaを学習しようと思っているのですが、この識別子や変数の理解は、プログラミングで重要な概念でしょうか?

Javaでも全く同じ議論が成立します。(ただし用語用法や初期値は異なる)
スコープについて調べてみると良いでしょう。

投稿2019/06/06 06:06

編集2019/06/06 06:08
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

big000

2019/06/06 06:40

すべて分かりやすかったですが、コンストラクタで初期化の説明を入れていた方をベストアンサーにしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問