不了解 const 对函数和类的用法
Don't understand the use of const for functions and classes
有人可以解释一下在函数声明和类中使用 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 不是也返回常量数组引用吗???
此外,当您确实将一个类的 1 个对象分配给另一个对象时,编译器会使用成员赋值,除非用户提供默认的复制构造函数,在这种情况下,会调用 THAT?
非常感谢!对不起,我有很多具体的问题。我非常感谢。
有人可以解释一下 const 在函数声明和类中使用时的用法吗?
成员函数const
意味着函数无法修改非mutable
数据成员。 这也意味着可以在类的const
实例上调用该函数,而非const
成员函数则不能。
const
也可以用于数据成员 - 这意味着它们必须在构造函数的初始化器列表中赋值,并且此后不能修改(即使是从非 const
成员函数(。
[
int x = 1; int &i = x;
不会编译,除非...
是的,确实如此。 你不能做的是:const int x = 1; int &i = x;
- 你不能这样做,因为这样的i
会错误地促进以后的任务,i = 4;
要求写信给const int x
。
允许对象数组赋值,例如
x = y = z
,但阻止像(x = y) = z
这样的数组赋值?
C++运算符优先级意味着x = y = z
- 不带括号 - 等效于x = (y = z)
,因此(y = z)
赋值会产生一个const
值,该值仍然可以分配给非const
对象x
。
这与(x = y) = z
形成鲜明对比,(x = y)
产生一个无法进一步分配的临时const
值(根据上述规则Array::operator=
它不是const
成员函数(
此外,当您确实将一个类的 1 个对象分配给另一个对象时,编译器会使用成员赋值,除非用户提供默认的复制构造函数,在这种情况下,会调用 THAT?
default
是程序员用来显式请求编译器生成的复制构造函数的关键字,即执行成员智能赋值的构造函数。 当用户提供自己的用户定义实现(或delete
复制构造函数(时,不使用默认实现。
是的,你假设是正确的。
const
表明您拥有的数据不是可变的,这只是一种编译器技术;汇编没有"恒定性"的范式。
(const_cast
就是一个很好的例子(
const
放在线上的位置也非常重要,尤其是对于指针。
例如
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();
}
该函数将打印"const shizam!
而是一个函数
void print_shazam(shizam &ref){
ref.print();
}
会打印"非常量希赞!
这很重要,因为定义类的人可以区分可以修改类的方法和不能修改类的方法;正如我所说,const
表明数据是不可变的。
同一本书中的这个例子:
const Array &Array::operator=(const Array &right){
if(&right != this){ //avoid self assignment
// blah blah
}
return *this; //enables x = y = z for example
}
这里已经讨论过了
- 构造函数的用法
- C++ 中函数中 Const 用法之间的差异
- 错误:使用复制和交换习惯用法的交换函数中"operator="的重载不明确
- 未命名的函数参数用法
- 使用指针复制构造函数用法
- CPP/C 中的常量用法和结构构造函数中的澄清
- 向下转换指向成员函数的指针.这是合法用法吗?
- 将 PIMPL 习惯用法与成员函数模板一起使用(无需预先了解所有可能的数据类型)
- 复制构造函数方法的用法
- C++向量用法错误:没有匹配的成员函数来调用"push_back"
- Constexpr静态成员函数用法
- 函数原型范围的有趣用法
- lambda 中的跨平台"auto"关键字用法:integral_constant作为函数参数
- 参数和成员变量在构造函数中的用法
- C 中的构造函数和破坏者的内联用法
- unique_ptr旧函数的用法
- 函数调用中“&”的用法,令人困惑
- 使用复制和交换习惯用法,复制对象的析构函数如何不解除分配指向内存
- 如何嵌入实时单元测试函数的主体作为 Doxygen 的示例用法
- C++析构函数删除包含动态数组作为数据成员的对象时的用法