不了解 const 对函数和类的用法

Don't understand the use of const for functions and classes

本文关键字:用法 函数 const 不了解      更新时间:2023-10-16

有人可以解释一下在函数声明和类中使用 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 *ptrint 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
}

这里已经讨论过了