1
讓我們看看下面的代碼(在直播:http://ideone.com/3Ky4Kr)const的行爲>>
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
class StrStrTest {
public:
StrStrTest(const std::string& ba) {
a = (char*)calloc(1, ba.length() + 1);
strcpy(a, ba.c_str());
}
virtual ~StrStrTest() {
free(a);
}
private:
char* a;
friend std::basic_ostream<char>& operator << (std::basic_ostream<char>& ss, const StrStrTest& a);
friend std::basic_istream<char>& operator >> (std::basic_istream<char>& ss,const StrStrTest& a);
};
std::basic_ostream<char>& operator << (std::basic_ostream<char>& ss, const StrStrTest& a) {
ss << a.a;
return ss;
}
std::basic_istream<char>& operator >> (std::basic_istream<char>& ss,
const StrStrTest& a) {
ss >> a.a; // <<-- HERE
// a.a = NULL;
return ss;
}
int main()
{
StrStrTest bb("foo");
std::cin >> bb;
std::cout << bb;
}
首先,爲什麼它編譯?在標有< < - HERE的行上(巧妙地)修改const
對象。 (顯然a.a = NULL;
不能編譯,這太明顯了)。
其次,這是否會導致未定義的行爲? PS:請不要認爲代碼不安全,可能會覆蓋它不擁有的內存,char*
與std::string
等等......我知道這些,這不是問題的關鍵,不是生產代碼。
您修改的內存分配在堆上,恰巧也是由const對象指向的。 – 2014-11-24 10:53:40