c++ - 引用传递是否在 C++ 运行时创建副本?
问题描述
我目前正在自己阅读 Bjarne Stroustrups 的《使用 C++ 的原则和实践》一书。在第 4 章结束时,我决定进行一些不同的练习,并创建一个超出我要求的程序。我请朋友对我的简单程序进行代码审查。他的评论之一是“过度使用引用将在运行时创建副本”,他建议改用指针。我认为通过引用传递并不会复制数据,而是允许您通过变量在内存中的位置来修改变量。有人可以解释这是否属实以及两种方法的成本/收益。我不喜欢详细讨论这些主题的章节,但我的好奇心已经迫不及待了。
请注意,这不是家庭作业。只是我试图更好地理解语言本身的存储、优化和最佳实践。
//Takes input, converts to inches, cm, meters, and ft, stores meters in vector, allows selection
//based off switch statement.
// Stores all conversions as meters in a vector.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const string c_units[4] = {"cm", "m", "in", "ft"};
constexpr double c_centimeters = {2.54};
constexpr double c_feet = {12};
constexpr double c_meters = {100};
bool LegalUnits(const string& init_units){
for(const string& x : c_units)
if (x == init_units) {
return true;
}
return false;
}
double Conversions(double init_value, const string& conv_units, vector<double>& converted_numbers){
double meters = 0.0;
if(conv_units == "m"){
meters = init_value;
converted_numbers.push_back(meters);
cout << init_value << " meters is :\n"
<< init_value*c_meters << " centimeters.\n"
<< init_value*c_meters/c_centimeters << " inches.\n"
<< init_value*c_meters/c_centimeters/c_feet << " feet.\n\n";
return 0;
} else if (conv_units == "cm"){
meters = init_value/c_meters;
converted_numbers.push_back(meters);
cout << init_value << " centimeters is :\n"
<< meters << " meters.\n"
<< init_value/c_centimeters << " inches.\n"
<< init_value/c_centimeters/c_feet << " feet.\n\n";
return 0;
} else if (conv_units == "ft") {
meters = init_value*c_feet*c_centimeters/c_meters;
converted_numbers.push_back(meters);
cout << init_value << " feet is :\n"
<< meters << " meters.\n"
<< init_value*c_feet << " inches.\n"
<< init_value*c_feet*c_centimeters << " centimeters.\n\n";
return 0;
} else {
meters = init_value*c_centimeters/c_meters;
converted_numbers.push_back(meters);
cout << init_value << " inches is :\n"
<< init_value/c_feet << " feet.\n"
<< init_value*c_centimeters << " centimeters.\n"
<< meters << " meters.\n\n";
return 0;
}
}
int main(){
string infinite_while = " ";
vector<double> converted_numbers = {};
while(infinite_while != "Exit"){
string init_units;
double init_value = 0;
char selection = ' ';
cout << "Please make a selection from the following switch statement."
"\n\t1. Make a conversion: 'A'"
"\n\t2. List all stored conversions in meters: 'B'"
"\n\t3. List smallest and largest conversions: 'C'"
"\n\t4. Exit: 'D'" << endl;
cin >> selection;
switch (selection) {
case 'A':
case 'a':
case '1':
cout << "Please input your value followed by the type separated by a space: ";
cin >> init_value >> init_units;
if(LegalUnits(init_units)){
Conversions(init_value, init_units, converted_numbers);
} else {
cerr << "\nSorry. That is not a valid unit for conversion.\n" << endl;
}
break;
case 'B':
case 'b':
case '2':
for(double x : converted_numbers)
cout << x << " m\n";
cout << "\n";
break;
case 'C':
case 'c':
case '3':
sort(converted_numbers.begin(), converted_numbers.end());
cout << converted_numbers[0] << " m\n" << converted_numbers[converted_numbers.size()-1]
<< " m\n\n";
break;
case 'D':
case 'd':
case '4':
cout << "Goodbye!";
infinite_while = "Exit";
break;
default:
cout << "Sorry! I don't know that conversion unit." << endl;
break;
}
}
return 0;
}
我已经包含了我所指的代码。我环顾了互联网,没有看到任何我理解的东西来回答这个问题。我的错误处理并不太彻底,它可以使用更多注释和更多错误消息进行调试。话虽这么说,这是我目前所处的水平。另外,请随时评论我将来如何做得更好。
感谢您的时间和考虑。
解决方案
推荐阅读
- swiftui - 使用 SwiftUI 的自省库 UIRefreshControl 不起作用
- angular - 在 httpInterceptor 中设置参数覆盖了我想附加的额外参数
- python - 为什么这个角色总是sizeHintRole?
- python - python - 从字典中映射数据框列中的值,列表为值
- javascript - 道具编号不会改变时间
- raspberry-pi - 在哪里为 raspbian buster 上的 openbox-session 设置 -nocursor
- deep-learning - 在训练实例分割时在图像数据集上创建增强的最佳方法是什么?
- android - Kotlin:如何获取当前位置?
- laravel - 添加求和行 - 使用 Livewire (Laravel)
- tree - 如何在不使用子节点的情况下访问 ANTLR 树的节点