OK、定数String
文字列を保持する(つまり、一度初期化すると変更できない)非常に単純なクラスは、copyctorと連結関数を実装します。私が作ったローカル変数が戻り値として正常に渡されない理由を本当に理解できないので、私に問題を与えているのはその関数です。conc
コード:
class String
{
public:
String(char*);
String(const String& other);
~String();
friend String conc(const String&, const String&);
friend std::ostream& operator<<(std::ostream&, const String&);
private:
const char* const str;
};
String::String(char* aStr) : str(aStr) {}
String::String(const String& other) : str(other.str) {}
std::ostream& operator<<(std::ostream& out, const String& s)
{
out<<s.str<<"\n";
return out;
}
String::~String()
{
delete str;
}
String conc(const String& s1, const String& s2)
{
int n = strlen(s1.str) + strlen(s2.str);
int i, j;
char* newS = new char[n+1];
for(i = 0; i < strlen(s1.str); ++i)
{
newS[i] = s1.str[i];
}
for(j = 0; j < strlen(s2.str); ++j)
{
newS[i+j] = s2.str[j];
}
newS[i+j] = '\0'; //newS is made correctly
String tmp(newS); // the tmp object is made correctly
return tmp; // here tmp becomes something else --- Why??
}
int main()
{
String s1("first");
String s2("SECOND");
String s3 = conc(s1, s2); //here the copy ctor should be called, right?
std::cout<<s3;
_getch();
}
コメントでわかるように、問題はconc
最後の関数にあります。関数が返す値が左辺値であってはならないことを考慮して、関数が意図的にではなく、を返すようにしましたString
。String&
説明して助けてください、ありがとう!:)