首页 > 解决方案 > 引用传递是否在 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;
}

我已经包含了我所指的代码。我环顾了互联网,没有看到任何我理解的东西来回答这个问题。我的错误处理并不太彻底,它可以使用更多注释和更多错误消息进行调试。话虽这么说,这是我目前所处的水平。另外,请随时评论我将来如何做得更好。

感谢您的时间和考虑。

标签: c++

解决方案


推荐阅读