gpt4 book ai didi

C++ 入门 5ed,7_43

转载 作者:行者123 更新时间:2023-11-27 22:57:00 24 4
gpt4 key购买 nike

您好,我在做练习 7.43 时有一个问题。问题是:“假设我们有一个名为 NoDefault 的类,它有一个采用 int 的构造函数,但没有默认构造函数。定义一个类 C,它有一个 NoDefault 类型的成员。为 C 定义默认构造函数。”

class NoDefault{
public:
NoDefault(int i){}
};

class C{

private:
NoDefault temp;
public:
C(int i):temp(i){}
};

int main(){
C c;
return 0;
}

为什么 C(int i):temp(i){} 不正确?

错误显示:

$ g++ -std=c++0x -o ex7_43 ex7_43.cpp
ex7_43.cpp: In function ‘int main()’:
ex7_43.cpp:16: error: no matching function for call to ‘C::C()’
ex7_43.cpp:12: note: candidates are: C::C(int)
ex7_43.cpp:7: note: C::C(const C&)

我知道 C():temp(0){} 会编译 find。

谢谢!

最佳答案

这个构造函数

C(int i):temp(i){}

不是该类的默认构造函数。但是在 main 这个声明里面

C c;

需要类的默认构造函数存在。所以编译器会报错,因为没有默认构造函数。

另一方面,这个声明

C():temp(0){} 

声明可以在声明中使用的默认构造函数

C c;

根据 C++ 标准(12.1 构造函数)

4 A default constructor for a class X is a constructor of class X that can be called without an argument.

您可以定义带参数的默认构造函数,但在这种情况下,参数应具有默认参数。例如

C(int i = 0):temp(i){}

上面的构造函数是默认构造函数,因为它可以不带参数调用。

在练习中写着:

Define the default constructor for C

所以你可以这样定义它

C():temp(0){} 

或者喜欢

C(int i = 0):temp(i){}

甚至以下方式

class C{

private:
NoDefault temp;
public:
C(int i);
};

C::C( int i = 0 ) :temp( i ) {}

即在类外但在main之前的构造函数定义中使用默认参数。

关于C++ 入门 5ed,7_43,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31860535/

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