jay*_*jay 2 c++ constructor const constants
我有以下代码:
class c_int {
public:
int &i;
c_int(int &in) : i(in) {
};
c_int(const int &in) : i(in) {
};
};
int main (void) {
const int i = 10;
const c_int c(i);
std::cout << c.i << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译它会给出以下错误消息:
tmp.cpp:12:30: error: invalid initialization of reference of type 'int&' from ex
presion of type 'const int'
Run Code Online (Sandbox Code Playgroud)
我遇到了一些麻烦,弄清楚如何让它工作,我应该如何初始化const对象内的引用?
编辑:理想情况下,我希望这个对象也用于非常量的int; 当对象未声明为const时.
进一步编辑:
我也希望使用这样的对象:
int main (void) {
int i = 10;
c_int c(i); // for some reason this calls the 2nd of my constructors, does name mangling not take const into account?
c.i = 9;
std::cout << i << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题不在于你的对象是const:你试图将const引用绑定到非const引用:这是非法的.
您可以将const引用绑定到const成员:
class c_int {
public:
const int &j;
c_int(const int &in) : j(in){ };
};
int main (void) {
const int i = 10;
c_int c(i);
std::cout << c.j << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
您仍然可以使用两种不同的类const和non const对象,或者如果你真的需要一个单独的类,知道自己在做什么,用一个const_cast(真的气馁:任何试图修改的对象将是未定义的行为):
class c_int {
public:
int& i;
c_int(int& in) : i(in){ }
c_int(const int& in) : i(const_cast<int&>(in)){ } // Very wrong
};
Run Code Online (Sandbox Code Playgroud)
或者,忘记通过引用传递和使用值语义:
class c_int {
public:
int i;
c_int(int in) : i(in){ }
};
Run Code Online (Sandbox Code Playgroud)
编辑:
对于int参数不是const的情况,您仍然可以添加一个非const引用的构造函数:
class c_int {
public:
const int &j;
c_int(const int &in) : j(in){ };
c_int(int &in) : j(in){ }
};
int main (void) {
const int i = 10;
const c_int c(i);
std::cout << c.j << '\n';
int i2 = 11;
const c_int d(i2);
std::cout << d.j << '\n';
}
Run Code Online (Sandbox Code Playgroud)