gpt4 book ai didi

c++ - 使用委托(delegate)调用构造函数和另一个构造函数体的区别

转载 作者:行者123 更新时间:2023-11-30 02:26:05 24 4
gpt4 key购买 nike

假设我有一个包含 2 个构造函数的类:

class Foo 
{
Foo(int x);
Foo();
...
}

我知道我可以从另一个构造函数调用一个构造函数,例如 Foo() : Foo(42) {},但我为什么不应该(或应该)执行以下操作:

Foo() {
Foo(42)
}

这些情况有什么区别?有些人建议使用“初始化器”方法,从任何构造函数调用它们各自的参数,但我对上述情况发生了什么感到困惑?

最佳答案

让我们举个例子:

#include <iostream>

class B
{
private:
int number;
public:
B()
{
B(1);
}

B(int x) : number(x)
{
std::cout << "Constructor: " << x << std::endl;
}

void print(){
std::cout << "Msg: " << number << std::endl;
}

~B(){std::cout << "Destructor: " << number << std::endl;}
};


int main() {
B b;
b.print();
return 0;
}

输出:

Constructor: 1
Destructor: 1
Msg: 1
Destructor: 1

你正在摧毁第二个物体!这很奇怪,如果我们使用指针会发生什么......

#include <iostream>

class B
{
private:
int* arr;
public:
B()
{
B(1);
}

B(int x)
{
std::cout << "Constructor: " << x << std::endl;
arr = new int[x];
}

void print(int n){
std::cout << "Msg: " << arr[n] << std::endl;
}

void set(int n,int val){
arr[n] = val;
}

~B()
{
std::cout << "Destructor: " << arr << std::endl;
delete[] arr;
}
};


int main() {
B b;
b.set(0,14);
b.print(0);
return 0;
}

Constructor: 1
Destructor: 0xc45480
Msg: 14
Destructor: 0xc45480

查找指针地址。它们是相同的,这意味着:

  • 我们正在删除的内存中写作。
  • 我们正在删除相同的内存两次。

这是两个严重的问题。你不应该那样做。

关于c++ - 使用委托(delegate)调用构造函数和另一个构造函数体的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43307471/

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