C++ Don';我不理解const在函数和类中的用法

C++ Don';我不理解const在函数和类中的用法,c++,constructor,constants,variable-assignment,operator-keyword,C++,Constructor,Constants,Variable Assignment,Operator Keyword,有人能解释一下const在函数声明和类中的用法吗?我知道如果一个函数返回一个常量变量/对象,那么这个东西不能在赋值运算符的左边使用?这是正确的吗?另外,我注意到如果你要做: int x = 1; int &i = x; 除非我是int的“常量引用”,否则上述代码不会编译。对于函数,如果参数声明为常量,则传递到函数参数中的参数必须是常量吗 我的书的一个例子有以下代码: const Array &Array::operator=(const Array &right) {

有人能解释一下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)返回的常量数组引用。但是在第一种情况下,x=y不也返回常量数组引用吗

此外,当您将一个类的一个对象分配给另一个对象时,除非用户提供默认的复制构造函数,否则编译器将使用成员分配,在这种情况下,调用的是正确的吗

非常感谢!对不起,我有很多具体的问题。我非常感谢

有人能解释一下const在函数声明和类中的用法吗

成员函数上的
const
表示该函数不能修改非
可变的
数据成员。它还表示该函数可以在类的
const
实例上调用,而非
const
成员函数不能

const
也可用于数据成员-这意味着它们必须在构造函数的初始化器列表中分配,并且此后不能修改(即使是从非
const
成员函数)

除非

是的。你不能这样做:
const int x=1;int&i=x;
-你不能这样做,因为这样的
i
会错误地促进以后的作业
i=4;
要求写入
const int x

允许对象数组指定,如
x=y=z
,但禁止
(x=y)=z

意思是
x=y=z
-不带括号-相当于
x=(y=z)
,因此
(y=z)
赋值产生一个
const
值,该值仍然可以赋值给非
const
对象
x

这与
(x=y)=z
形成对比,其中
(x=y)
产生一个临时
常量
值,无法进一步赋值(根据上述规则,给定
数组::运算符=
不是
常量
成员函数)

此外,当您将一个类的一个对象分配给另一个对象时,除非用户提供默认的复制构造函数,否则编译器将使用成员分配,在这种情况下,调用的是正确的吗


default
是程序员用来显式请求编译器生成的复制构造函数的关键字,即执行成员分配的构造函数。用户提供自己的用户定义实现时(或
delete
s复制构造函数)未使用默认实现。

是的,您的假设是正确的

const
表示您拥有的数据是不可变的,但这只是一种编译器技术;汇编没有“const ness”的范例

const_cast
就是一个很好的例子)

const
放在一行上的位置也非常重要,尤其是指针

e、 g

常数int*ptr
常数int*ptr

但这并不完全适用于引用,所以我想这只是一个糟糕的例子


const
在定义类方法时也很重要。向对象获取
const&
时,哪些方法可用

这是一个定义明确的案例:

#include <iostream>
class shizam{
    public:
        void print() const {std::cout << "const shizam!\n";}
        void print()       {std::cout << "non-const shizam!\n";}
};
该函数将打印“const shizam!”

而是一个函数

void print_shazam(shizam &ref){
    ref.print();
}
将打印“非const shizam!”

这一点很重要,因为定义类的人可以将可以修改类的方法和不能修改类的方法分开;正如我所说,
const
表示数据是不可变的


同一本书中的这个例子:

const Array &Array::operator=(const Array &right){
    if(&right != this){ //avoid self assignment
        // blah blah
    }
    return *this; //enables x = y = z for example
}

已经讨论过

在需要非const限定类型的情况下,不能使用const限定类型的值,就像通常在赋值表达式的lhs上一样。请参见错误定义op=。您所说的不会编译的代码确实会编译,为什么您认为不会?在wri之前ting“上面的不会编译”,试着编译它!!哦,如果运算符相同,我认为优先级规则是从左到右的?因此1+2+3将计算为1+(2+3)?ThanksA函数返回的引用可以用作左值或右值?例如:cout@KevinCheng:
1+2+3
-->
(1+2)+3
…请参阅链接页面的“关联性”列,其中说明了哪些运算符是“从左到右”和“从右到左”,请注意,相关运算符是“加减法”,而不是“一元加减法”函数返回的引用可以用作左值或右值?例如:
cout wait,x=const&i和x=&const i是同一件事??它们都无效,你是说
const T&x=i
T const&x=i
?是的。它们是同一件事吗?我不知道引用只能声明一次。我认为它们就像指针。是的,它们是一样的。引用本身是不可变的,但是数据本身是可变的,这取决于引用的类型。
const Array &Array::operator=(const Array &right){
    if(&right != this){ //avoid self assignment
        // blah blah
    }
    return *this; //enables x = y = z for example
}