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

why I cannot use "const string* sp = 0" to initialize in a constructor

本文关键字:构造函数 初始化 sp string 不能 为什么 const      更新时间:2023-10-16

我的问题是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*’
private:
    int num;
    string* sp;

sp是非const,但p是:

const string* p = 0
结果是这个sp(p)基本上是这样的:
string* sp = (const string*)0;

它在抱怨,因为这样做会删除字符串的const -ness

这是因为您的sp成员不是const

string* sp;

但是您的参数pconst。结果是,您试图将const指针赋值给非const指针-因此出现错误。

要解决这个问题,您还需要声明sp const at。

const string* sp;

我想你对const的各种含义感到困惑了。

 const string*sp;

声明了一个指向常量对象的指针,它只允许访问类string的常量方法。

 string*const sp;

声明一个指向字符串的指针作为类的常量成员,必须在构造函数中初始化sp,并且不能更改(除非使用const_cast<>)。

 const int&num;
参数列表中的

意味着函数承诺不改变num引用的整数的值,但它当然可以复制它的值(就像您所做的那样)。对应于string指针的操作应该是

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