问题描述
- C++ 字符串指针输出的为什么是完整字符串,而不是地址
-
char str[3] = {'a','b',''}; cout<<str<<endl; //1 char *pChar = str; cout<<pChar<<endl; //2 int in[3] = {1,2,3}; cout<<in<<endl; //3
以上代码,1和2处的str、pChar不是指针么?为什么输出的是“ab”,而不是一个地址? 3处的in输出的就是个地址。
解决方案
cout对此有重载,如果是字符串,输出的是内容。你可以做一个强制类型转换,让它调用整数的重载版本
cout<<(int)pChar<<endl;
解决方案二:
cout的operator的 << 有重载char*等参数,会一直输出到结束符。可以查看源码
解决方案三:
//自定义拷贝构造函数
classname(const classname &ob)
{
//自定义拷贝构造函数的函数体
}
// 其中ob是用来初始另一个对象的对象的引用
class StringData{
private: char *str;
public:
StringData(char *s){
str=new char[strlen(s)+1];
strcpy(str,s);
}
StringData(const StringData &p){ // 拷贝构造函数
str=new char[strlen(p.str)+1];
strcpy(str,p.str);
}
~StringData() { delete str; }
//…
};
int main()
{
StringData x(“abc”);
StringData y(x);
}
拷贝构造函数是一种特殊的构造函数。**它用于依据已存在的对象建立一个新对象。**
如果一个对象里面有指针成员,并且这个指针已经动态分配空间了,同时,对象有析构函数对这个指针进行释放。如上面那个例子,如果我们通过这个对象创建一个新对象:
A a("123");
A b = a; // 调用拷贝构造函数
如果我们没有自定义拷贝构造函数,导致对象 a 和 b 的指针成员指向同一个地址空间,当对象生命周期结束时,a 和 b 都会调用析构函数,最后导致,这个指针会被释放 2 次,导致内存出问题。
所以,对象有指针成员,尽量自定义拷贝构造函数。
解决方案四:
一楼是傻逼,乱讲的,2,3楼讲的是正确的,就是因为操作符(<<)重载的原因。
解决方案五:
别激动,本来是回答 《如何自定义拷贝构造函数》, 后来粘贴错了,又不能删除。
可以点击链接,验证一下。如何自定义拷贝构造函数
解决方案六:
本来是回答 《如何自定义拷贝构造函数》, 后来粘贴错了,又不能删除。
可以点击链接,验证一下。如何自定义拷贝构造函数如何自定义拷贝构造函数
解决方案七:
路过,cout<<&pChar<<endl ,试试这样。确实是重载函数的问题,cout<<pChar<<endl; //2和cout<<in<<endl; //3 他们调的不是同一个函数
解决方案八:
需要输出地址时可用“&变量”,前面加上cout<<即可,因C++语言与C语言不同所致。