gpt4 book ai didi

c++ - 使用非常量构造常量对象

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:10 24 4
gpt4 key购买 nike

我有一个带有构造函数的类,该构造函数采用分配给该类成员的非常量引用。现在我想创建一个所述类的 const 对象,但是如果我将 const 引用传递给构造函数,构造函数会提示。下面的代码是对我的原始代码的简化,它演示了这个问题。

据我所知,创建 const 对象应该没有问题,因为它基于 const 数据?

如何实现我在 create_const_a 中尝试做的事情?

#include <iostream>

class A {
private:
double &d;
const int &i;
public:
A(double &dd, const int &ii)
: d(dd), i(ii)
{}

void set_d(double a) {
d = a;
}

void print() const {
std::cout << d << " " << i << std::endl;
}
};


A create_a(double &dd, const int &ii) {
return A(dd,ii);
}

const A create_const_a(const double &dd, const int &ii) {
return A(dd,ii);
}


void foo(A a)
{
a.set_d(1.3);
a.print();
}

void bar(const A a)
{
a.print();
}


int main(int argc, char *argv[])
{
double d = 5.1;
int i = 13;

foo(create_a(d,i));

bar(create_const_a(d,i));

return 0;
}

我得到的错误是:

test.cc: In function ‘const A create_const_a(const double&, const int&)’:
test.cc:27:17: error: binding ‘const double’ to reference of type ‘double&’ discards qualifiers
return A(dd,ii);
^
test.cc:8:3: note: initializing argument 1 of ‘A::A(double&, const int&)’
A(double &dd, const int &ii)
^

更新:在学习了一些关于 const 如何与对象和非 const 引用一起工作的新知识之后,我最终通过引入另一种类型解决了最初的问题,比如 ConstA ,它只包含 const 引用,然后可以在每个有问题的情况下使用。

最佳答案

C++ 禁止这样做以避免将 const 引用转换为非常量。

这是一个如何发生的小例子:

struct foo {
int& a;
foo(int& b) : a(b) {}
void bar() const {
a = 5;
}
};

上面的代码编译得很好,因为 a = 5 改变了 foo 对象的状态;它改变了外部 int 的状态,所以 foo::bar 可以是 const

现在假设我们可以这样做:

const foo make_const(const int& x) {
return foo(x); // Not allowed
}

那么我们就可以写

const foo f(make_const(10));
f.bar();

并修改对临时 int 的引用,这是未定义的行为。

这是一个小demo :

int x = 10;
cout << x << endl;
const foo f(x);
f.bar();
cout << x << endl;

打印

10
5

关于c++ - 使用非常量构造常量对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41718787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com