二つの文字列を合成し、その長さを求めるする機能を持つクラス、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を学習しようと思っているのですが、この識別子や変数の理解は、プログラミングで重要な概念でしょうか?
答えや、この部分に関する参考文献を教えていただきたいです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。