为什么我不能使用“const string * sp = 0”在构造函数中初始化

时间:2011-11-21 21:55:07

标签: c++ g++

我的问题是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*’

3 个答案:

答案 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;

但您的参数pconst。结果是你试图为非const指针分配一个const指针 - 因此错误。

要解决此问题,您还需要声明sp const。

const string* sp;

答案 2 :(得分:1)

我认为你对const的各种含义感到困惑。

 const string*sp;

声明一个指向常量对象的指针,该对象只允许访问类字符串的常量方法。

 string*const sp;

声明一个指向字符串的指针,该字符串是该类的常量成员,您必须在构造函数中初始化sp并且不能更改(除非使用const_cast&lt;&gt;)。

 const int&num;
参数列表中的

表示函数承诺不会改变num引用的整数的值,但它当然可以复制其值(如您所做)。字符串指针的相应操作是

 HasPtr(string*const&p) : sp(p) { /* ... */ }

并且本来是完全合法的,虽然相当不正统。