我的问题是const string* p
给了我一个错误。这有什么问题?因为我没有改变原来的价值。 const int& n = 0
工作正常。
#include <iostream>
using namespace std;
class HasPtr
{
private:
int num;
string* sp;
public:
//constructor
HasPtr(const int& n = 0, const string* p = 0): num(n), sp(p) {}
//copy-constructor
HasPtr(const HasPtr& m): num(m.num), sp(m.sp) {}
//assignment operator
HasPtr& operator=(const HasPtr& m)
{
num = m.num;
sp = m.sp;
return *this;
}
//destructor
~HasPtr() {}
};
int main ()
{
return 0;
}
输出错误是:
error: invalid conversion from ‘const std::string*’ to ‘std::string*’
答案 0 :(得分:5)
private:
int num;
string* sp;
sp
是非常量的,但p
是:
const string* p = 0
结果是sp(p)
基本上是这样的:
string* sp = (const string*)0;
这是抱怨,因为这样做会删除字符串的const
-
答案 1 :(得分:4)
这是因为您的sp
成员不是const
。
string* sp;
但您的参数p
是const
。结果是你试图为非const指针分配一个const
指针 - 因此错误。
要解决此问题,您还需要声明sp
const。
const string* sp;
答案 2 :(得分:1)
我认为你对const的各种含义感到困惑。
const string*sp;
声明一个指向常量对象的指针,该对象只允许访问类字符串的常量方法。
string*const sp;
声明一个指向字符串的指针,该字符串是该类的常量成员,您必须在构造函数中初始化sp并且不能更改(除非使用const_cast&lt;&gt;)。
const int#
参数列表中的表示函数承诺不会改变num引用的整数的值,但它当然可以复制其值(如您所做)。字符串指针的相应操作是
HasPtr(string*const&p) : sp(p) { /* ... */ }
并且本来是完全合法的,虽然相当不正统。