我想知道这个函数声明中的逻辑:
CMyException (const std::string & Libelle = std::string(),...
通过引用使用变量有什么意义?通常,只要可以在内部修改,就通过引用传递变量...所以如果你使用关键字const
,这意味着它永远不会被修改。
这是矛盾的。
有人可以向我解释一下吗?
答案 0 :(得分:5)
实际上,引用用于避免不必要的对象副本。
现在,要了解使用const
的原因,请尝试以下操作:
std::string & x= std::string(); //error
它会给出编译错误。这是因为表达式std::string()
创建了一个临时对象,该对象不能绑定到非const引用。但是,临时可以绑定到const
引用,这就是需要const
的原因:
const std::string & x = std::string(); //ok
现在回到代码中的构造函数:
CMyException (const std::string & Libelle = std::string());
它设置参数的默认值。默认值是从临时对象创建的。因此,您需要const
(如果您使用参考)。
使用 const 引用也有一个优点:如果你有这样的构造函数,那么你可以像这样引发异常:
throw CMyException("error");
它从字符串文字std::string
中创建一个"error"
类型的临时对象,该临时对象绑定到const
引用。
答案 1 :(得分:3)
有些参数可能会使用相当多的内存。如果将参数作为值传递,则将复制该参数,并将副本传递给该方法。
将它们作为引用传递只会将指针传递给更快的方法并保存副本的内存。
答案 2 :(得分:1)
例如,您只能使用const reference argumernt:
执行此操作CMyException("foo");
考虑一下,然后就会变得清晰。
答案 3 :(得分:1)
通过const引用传递原始类型(int
,char
,..)是没有意义的。即使是std::string
我也认为不需要它。
但是,较大的结构或类在通过值时需要副本,因此存在开销。 const
引用模拟传递值的行为(外部变量未被修改),但也阻止了额外的副本。
答案 4 :(得分:0)
没有。并不总是需要每当您传递任何变量作为参考时,它只能在内部进行修改。如果变量按值传递,则只要调用该函数,就会生成变量的副本。
另一方面,引用变量使用相同的对象,并且实际上只传递内存地址(与使用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
是有意义的,而不是其他方面。如果你正在复制我传递的变量然后修改它,我真的不在乎。但是,如果您不想修改我传递的对象(因为您将使用相同的对象),那么我会非常高兴知道,我可以在此下严格进一步定义我的应用程序的过程。保证。
答案 5 :(得分:0)
我通常将所有内容都作为常量传递 - 我从不修改参数,通过原始类型的值,通过引用自定义类型。在大多数情况下,传递原始类型的值更有效 - 考虑无符号短 - 按值2个字节,参考4-8个字节,具体取决于指针大小。