初学者C++:如果使用"const",通过引用使用变量有什么意义?

C++ beginner: what is the point of using a variable by reference if using "const"?

本文关键字:变量 什么 引用 C++ 如果 const 初学者      更新时间:2023-10-16

我想知道这个函数声明中的逻辑:

CMyException (const std::string & Libelle = std::string(),...

通过引用使用变量有什么意义?通常,只要变量可能在内部被修改,就可以通过引用传递它。。。因此,如果您使用关键字const,这意味着它永远不会被修改。

这是矛盾的。

有人能向我解释一下吗?

实际上引用是用来避免不必要的对象复制。

现在,要了解为什么使用const,请尝试以下操作:

std::string & x= std::string(); //error

它将给出编译错误。这是因为表达式std::string()创建了一个临时对象,该对象无法绑定到非常量引用。然而,临时可以绑定到const引用,这就是为什么需要const

const std::string & x = std::string(); //ok

现在回到代码中的构造函数:

CMyException (const std::string & Libelle = std::string());

它设置参数的默认值。默认值是从临时对象中创建的。因此,您需要const(如果您使用引用)。

使用const引用还有一个优点:如果你有这样的构造函数,那么你可以引发这样的异常:

throw CMyException("error"); 

它从字符串文字"error"中创建一个类型为std::string的临时对象,该临时对象绑定到const引用。

有些参数可能会占用相当多的内存。如果将参数作为值传递,它将被复制,并将副本传递给方法。

将它们作为引用传递只会将指针传递给速度更快的方法,并为副本节省内存。

例如,您只能使用const-reference argument:来执行此操作

CMyException("foo");

仔细想想,就会明白。

通过const引用传递基元类型(intchar、..)是没有意义的。即使对于std::string,我也认为它不需要。

然而,较大的结构或类在传递值时需要一个副本,因此存在开销。const引用模拟传递值的行为(外部变量未修改),但也防止额外的副本。

否。无论何时传递任何变量作为引用,都只是为了在内部对其进行修改,这并不总是必要的。如果变量是按值传递的,那么每当调用该函数时,都会生成变量的副本。

另一方面,引用变量使用相同的对象,本质上只传递内存地址(与使用std::string*相同,但不能使用空内存地址)。所以,当你做const std::string& x这样的事情时,你要说的是:

1. The passed argument will not be copied. The same object will be used as in memory.
2. The function will absolutely not modify the object that it is handling.

仔细想想,当您使用引用时,使用const是有意义的,而不是其他情况。如果你正在复制我传递的一个变量,然后修改它,我真的不在乎。然而,如果你不打算修改我传递的对象(因为你将使用相同的对象),我可以在这个保证下严格地进一步定义我的申请过程,这将是一件非常好的事情。

我通常将所有内容作为常量传递-我从不修改参数,对基元类型按值修改,对自定义类型按引用修改。在大多数情况下,传递基元类型的值更有效——考虑无符号短-按值2字节,按引用4-8字节,具体取决于指针大小。

相关文章: