一开始自己给的答案是否定的:
string s1 = "a";
string s2 = "b";
cout << s1 << " " << s2 << endl; //输出s1,s2
cout << &s1 << " " << &s2 << endl; //输出s1,s2地址
cout << endl;
s1 = s2;
cout << s1 << " " << s2 << endl; //输出s1,s2
cout << &s1 << " " << &s2 << endl; //输出s1,s2地址
a b
0x7fff5fbff478 0x7fff5fbff460
b b
0x7fff5fbff478 0x7fff5fbff460
思考是这样:如果string是类的话,s1 = s2执行之后它们2个的地址应该是一样的。
后来,我看到下面这样:
string str("hello, world");
string s1 = &str[0];
cout << s1 << endl; //输出s1
char *p = &str[0];
cout << p << endl; //输出p
它们运行结果是一样的:
hello, world
hello, world
既然string可以取得地址,与指针功能一样,那它应该是个类吧。
最靠谱的做法还是瞄一下文档:
长长一串东西有些看不懂,但我确实认得下面高亮那行的"class"修饰符,string无疑是个类:
那为何前面的s1 = s2; 输出的s1和s2地址不一样呢?
经典c++教材《c++ primer(中文版第5版)》p76里说到:
如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。
这句话的意思是,s1 = s2; 这条语句,只能把s2的值拷贝到s1中去。也就是c++把等号(=)运算符重载了,重载后的等号不是指针赋值。导致不能靠这种方式探究string是不是类。