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

时间:2014-10-27 02:37:14

标签: c++ constructor const variable-assignment operator-keyword

有人可以在函数声明和类中使用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也返回一个常量数组引用???

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

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

2 个答案:

答案 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 *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();
}

该功能将打印&#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