提高最简单的C ++程序的效率

时间:2015-02-10 20:20:50

标签: c++

一位兄弟建议我通过引用传递构造函数和类的其他成员函数中的参数,甚至从成员函数返回引用,这样就可以避免一直复制变量。我是一个非常天真的程序员,并且不知道如何做到最好。你能告诉我如何将它应用到以下程序中:

#include <iostream>
#include <string>

using namespace std;

class Student {
    public:
        Student(string s, int i) {
            name = s;
            id = i;
        }
        void setName(string s) {
            name = s;
        }
        void setId(int i) {
            id = i;
        }
        string getName() {
            return name;
        }
        int returnId() {
            return id;
        }
    private:
        string name;
        int id;
};

int main() {
    Student s1("Seth",515);
}

这就是我所做的:

#include <iostream>
#include <string>

using namespace std;

class Student {
    public:
        Student(string& s, int& i) {
            name = s;
            id = i;
        }
        void setName(string& s) {
            name = s;
        }
        void setId(int& i) {
            id = i;
        }
        string& getName() {
            return name;
        }
        int& returnId() {
            return id;
        }
    private:
        string name;
        int id;
};

int main() {
    string s = "John";
    int i = 515;
    Student s1(s,i);
    return 0;
}

返回引用变量是否正常,我的意思是,在某些情况下,它们是否超出范围?

1 个答案:

答案 0 :(得分:1)

我完全赞同亚历山大:首先,在你的计划中,它不会给你任何东西。其次,过早优化是万恶之源。

但是,如果您有兴趣,一般通过引用传递值通常如下所示:

void myFunction(const MyComplicatedClass& argument) {...}

此处argument作为对常量对象的引用传递。这意味着:

  1. 我们传递一个引用,而不是将值传递给函数,所以我们的函数在访问argument时,本质上将使用与函数相同的内存区域,调用{{ 1}}。但如果它与相同的内存区域一起工作,它可能会搞砸它。所以
  2. 我们传递对常量对象的引用。这意味着,编译器将确保我们不做任何事情,这可能会弄乱原始对象(作为myFunction传递给我们)。它不是100%的保证,我们在谈论C ++,在这里拍摄相对容易,但编译器会尽力而为:)
  3. 但重要的是要理解,在任何地方使用这种方法毫无意义。例如,将argument值作为const引用传递是没有意义的,因为它已经是原始类型。你甚至可能会降低效率。许多类以某种方式实现,这使得复制成本非常低廉。而且,最后,编译器现在非常聪明。他们可以优化你没有想到的许多事情。

    尽管如此,我并不是说这没用。与每个工具一样,您应该了解它,它是如何工作的以及何时使用它。它来自经验和学习。

    对于返回引用,永远不会返回对局部变量的引用。它们在超出范围时会被删除,当您尝试访问已删除内容的引用时,程序将崩溃。但是,你可以将引用(const引用)返回给任何东西,你确定它会活得足够长。例如,类字段。