C++ 指针练习改进

C++ 指针练习改进,c++,pointers,C++,Pointers,你好!!我想更多地了解指针,所以我写了以下内容: 然后我将其初始化为main: 为什么要在此处和何处使用指针 这里使用指针唯一有意义的地方是将结构传递给构造函数: Movie(string moviename, Data* dat, int age, int seats) { name = moviename; data = *dat; requiredAge = age; freeSeats = seats; }

你好!!我想更多地了解指针,所以我写了以下内容:

然后我将其初始化为main:


为什么要在此处和何处使用指针

这里使用指针唯一有意义的地方是将结构传递给构造函数:

    Movie(string moviename, Data* dat, int age, int seats) {
        name = moviename;
        data = *dat;
        requiredAge = age;
        freeSeats = seats;
    }
这样可以避免在调用构造函数时创建结构的完整副本。仅仅传递指针就便宜了一点

在C中,这是唯一的选择,C++中有一个更好的方法:使用引用:

    Movie( const string& moviename, const Data& dat, int age, int seats) {
        name = moviename;
        data = dat;
        requiredAge = age;
        freeSeats = seats;
    }
顺便说一下,对于
int
参数,通过引用传递它们是没有用的,因为它们不比指针大(以字节为单位)

更好的版本将使用初始化列表:

    Movie( const string& moviename, const Data& dat, int age, int seats)
        : name(moviename), data(dat), requiredAge(age), freeSeats(seats) {}

(感谢您的提示,@NathanOliver)

如果您可以编写代码而不使用指针(看起来您已经这样做了),那么您不应该在任何地方使用指针;它们是不必要的。即使是出于优化的原因?必须查找另一个间接级别也会减慢速度,而不是加快速度。@petruherro“甚至不是出于优化的原因?”指针不会优化任何东西,编译器会为您做这件事。请从共享的角度考虑指针。指针允许从代码中的不同位置引用和使用(修改)相同的物理实体(主要是使用c++等语言的对象实例)。特别是在调用方法时,需要为方法体提供对参数对象的引用,以便真正使用参数。否则,编译器将需要在堆栈上创建对象的卷影,并在返回时将其复制回原始实例。这将适用于不可变,因为不需要最后一步,但通常效率极低。您可能还希望向OP展示他们可以使用成员初始化列表初始化所有类成员并节省一些cpu周期。通常情况下,您希望构造函数正文中包含0个代码。使用初始化列表的优点是什么?@petruherro:您可以在这里找到一些信息,也可以在许多其他地方找到这些信息。@petruherro这很好地解释了这一点:@FrankPuffer谢谢您的帮助。
    Movie( const string& moviename, const Data& dat, int age, int seats) {
        name = moviename;
        data = dat;
        requiredAge = age;
        freeSeats = seats;
    }
    Movie( const string& moviename, const Data& dat, int age, int seats)
        : name(moviename), data(dat), requiredAge(age), freeSeats(seats) {}