初学者C++:如果使用"const",通过引用使用变量有什么意义?
C++ beginner: what is the point of using a variable by reference if using "const"?
我想知道这个函数声明中的逻辑:
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");
仔细想想,就会明白。
int
、char
、..)是没有意义的。即使对于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字节,具体取决于指针大小。
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 未初始化的变量有什么危险
- 在C/C++中将变量名定义为__00000001有什么好处吗
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 存储变量的更有效方法是什么?
- 变量 BitMask 在函数 CeilLog2 中的实际效果是什么?
- 这个变量在 C++ 中的范围是什么?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 变量按什么顺序相乘
- 与普通变量相比,仅仅读取原子变量的性能有什么不同吗
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- C++在变量的内存地址上做什么来"deallocate"它?
- 有什么方法可以使用 int 变量来完成组件名称吗?
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 正在连接的等待条件变量的线程会发生什么情况?
- 当使用Lua作为嵌入式语言(比如c++)时,有什么简单/方便的方法可以找到变量在Lua中的定义位置吗
- 什么是变量均值'int border = borderType & ~BORDER_ISOLATED'?