C++ Don';我不理解const在函数和类中的用法
有人能解释一下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) {
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
}