gpt4 book ai didi

c++ - 具有初始值的类构造

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:09 26 4
gpt4 key购买 nike

我是 C++ 的新手,以及类的整个概念 - 我仍在阅读一本书来尝试学习。我正在阅读的书说,当我构造一个类时,我可以通过这样做来分配默认值:

class foo {
public:
foo(char c, int i);
private:
char exampleChar;
int exampleInt;
};

foo::foo(char c, int i):
exampleChar(c),
exampleInt(i)
{}

此代码(对我而言)看起来非常困惑,并且不遵循我在其他语言中习惯的规则。 我的问题是,执行上述操作和执行此操作(在下面,我个人认为看起来更干净)之间有什么区别?

foo::foo(char c, int i) {
exampleChar = c;
exampleInt = i;
}

我正在考虑的事情有:如果大规模进行,是否存在性能/效率问题 - 还是完全一样?

最佳答案

第一种方式,通过执行 : exampleChar(c), exampleInt(i) 被称为初始化列表。

如果您采用第二种方式,则这两个变量是默认构造的首先1然后您为它们赋值。 (当构造函数的实际主体被输入时,任何没有被初始化列表初始化的东西都是默认构造的。)这是浪费时间,因为你只是在覆盖值。对于像 intchar 这样的小类型,这没什么大不了的,但是当这些成员变量是需要大量周期来构造的大类型时,您肯定希望使用初始化列表。

第二种方法不会浪费时间给它们一个默认值然后覆盖它 - 它会将它们的值直接设置为您给它的值(或者如果成员是一个对象则调用正确的构造函数)。

你可以明白我们这样做的意思:

class MyClass {
public:
int _i; // our data

// default constructor
MyClass() : _i(0) { cout << "default constructor"; }

// constructor that takes an int
MyClass(int i) : _i(i) { cout << "int constructor"; }

// assignment operator
void operator=(int i) { _i = i; cout << "assignment operator"; }
};

class OtherClass {
public:
MyClass c;

OtherClass() {
c = 54;
}
};

OtherClass oc;

你会看到的

default constructor
assignment operator

被打印出来。这是两个函数调用,对于其他类来说,这可能是昂贵的。

如果将OtherClass的构造函数改成

OtherClass() : c(54) {   }

你会看到的

int constructor

被打印出来。与两个相比,只需一个电话。这是最有效的方法。

当你

  1. 具有没有默认构造函数的类型。您必须在初始化列表中调用正确的构造函数。

  2. 有一个 const 成员,你想给它一些值(而不是永久地拥有默认值)

  3. 有引用成员。您必须在这些上使用初始化列表。

tl;dr:这样做是因为它至少和另一种方式一样快,但绝不会比另一种方式慢,有时甚至快得多。

1 对于像 intchar 这样的内置类型,它们实际上根本就没有构造;他们只是拥有他们之前碰巧拥有的任何内存的值(value)。

关于c++ - 具有初始值的类构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7207884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com