有人可以在函数声明和类中使用const时解释const的用法吗?我理解如果一个函数返回一个const变量/对象,那么该东西不能在赋值运算符的左侧使用?它是否正确?此外,我注意到,如果你这样做:
int x = 1;
int &i = x;
除非我是int的“常量引用”,否则上面的代码不会编译。对于函数,如果参数声明为常量,那么传递给函数参数的参数必须是常量吗?
我的书的一个例子有以下代码:
const Array &Array::operator=(const Array &right)
{
if (&right != this) //avoid self assignment
//blah blah
return *this; //enables x = y = z for example
}
为什么这个函数允许对象数组赋值,例如x = y = z,但是阻止像(x = y)= z ??本书的推理是“因为z不能分配给由(x = y)返回的const数组引用。但在第一种情况下,不是x = y也返回一个常量数组引用???
另外,当你将一个类的一个对象分配给另一个时,编译器使用成员智能赋值,除非用户提供了一个默认的复制构造函数,在这种情况下,调用是否正确?
非常感谢你!对不起,我有很多具体问题。我非常感激。
答案 0 :(得分:1)
成员函数上的有人可以在函数声明和类中使用const时解释const的用法吗?
const
表示该函数无法修改非mutable
数据成员。它还意味着可以在类的const
实例上调用该函数,而非const
成员函数则不能。
const
也可用于数据成员 - 这意味着必须将它们分配到构造函数的初始化列表中,之后无法修改(即使非const
成员也是如此函数)。
[
否则无法编译int x = 1; int &i = x;
除非......
是的。你不能做的是:const int x = 1; int &i = x;
- 你不能这样做,因为这样的i
会错误地促进后来的任务ala i = 4;
要求写入const int x
。
允许对象数组分配,例如
x = y = z
,但会阻止(x = y) = z
之类的内容吗?
C++ operator precedence表示x = y = z
- 没有括号 - 相当于x = (y = z)
,因此(y = z)
分配产生的const
值仍然可以分配给非 - const
对象x
。
与(x = y) = z
形成对比,其中(x = y)
产生的临时const
值无法进一步分配(给定Array::operator=
不是const
成员函数,按照上面提到的规则)
此外,当您将一个类的一个对象分配给另一个时,编译器使用成员智能分配,除非用户提供默认的复制构造函数,在这种情况下,调用是否正确?
default
是程序员用来明确要求编译器生成的复制构造函数的关键字,即执行成员明智分配的复制构造函数。当用户提供他们自己的用户定义的实现(或delete
的复制构造函数)时,默认实现不使用。< / p>
答案 1 :(得分:0)
是的,你的假设是正确的。
const
表示您拥有的数据不可变,但这只是一种编译技术;装配没有“常量”的范例。
(const_cast
就是一个很好的例子)
将const
放在一行上也非常重要,特别是对于指针。
e.g。
const int *ptr
与int const *ptr
尽管如此,它并不适用于参考文献,所以我想这只是一个不好的例子。
const
也很重要。当你得到一个const&
对象时,哪些方法可用?
嗯,这是一个定义明确的案例:
#include <iostream>
class shizam{
public:
void print() const {std::cout << "const shizam!\n";}
void print() {std::cout << "non-const shizam!\n";}
};
然后,如果以后我们有一个功能:
void print_shazam(const shizam &ref){
ref.print();
}
该功能将打印&#34; const shizam!&#34;
但是功能
void print_shazam(shizam &ref){
ref.print();
}
会打印&#34;非常规shizam!&#34;
这很重要,因为那时定义类的人可以分离可以修改类的方法和那些不能修改类的方法。正如我所说,const
表示数据不是可变的。
这个例子来自同一本书:
const Array &Array::operator=(const Array &right){
if(&right != this){ //avoid self assignment
// blah blah
}
return *this; //enables x = y = z for example
}
已经讨论过here