为什么我不能使用 "const string* sp = 0" 在构造函数中初始化
why I cannot use "const string* sp = 0" to initialize in a constructor
我的问题是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;
但是您的参数p
是const
。结果是,您试图将const
指针赋值给非const指针-因此出现错误。
要解决这个问题,您还需要声明sp
const at。
const string* sp;
我想你对const的各种含义感到困惑了。
const string*sp;
声明了一个指向常量对象的指针,它只允许访问类string的常量方法。
string*const sp;
声明一个指向字符串的指针作为类的常量成员,必须在构造函数中初始化sp,并且不能更改(除非使用const_cast<>)。
const int#
参数列表中的意味着函数承诺不改变num引用的整数的值,但它当然可以复制它的值(就像您所做的那样)。对应于string指针的操作应该是
HasPtr(string*const&p) : sp(p) { /* ... */ }
相关文章:
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 我们可以用参数化构造函数初始化结构的数组吗?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 类内初始化与构造函数初始化列表的顺序
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 使用复制构造函数初始化 new[]
- 如何从子类的构造函数初始化父类的私有成员
- 在构造函数初始化列表中使用 std::variant
- 使用构造函数初始化结构还是在之后设置其值更好?
- C++ 没有匹配的构造函数初始化 []
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- 使用所述填充构造函数初始化向量中的向量
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 这是使用构造函数初始化数组对象的最佳方法吗?
- 内置类型的构造函数初始化
- 构造函数初始化和对象损坏