声明类实例的两种方式的不同之处
difference in two ways of declaring a class instance
假设我们有一个没有默认构造函数的类:
class Foo {
public:
Foo(int data) : _data(data) { }
int data(void) const { return _data; }
private:
int _data;
};
为什么编译它,它做什么:
Foo x();
即使上述编译,您也无法执行以下任何操作:
x.data(); // doesn't compile: request for member 'data' in 'x', which is of non-class type 'Foo()'
x->data(); // doesn't compile: request for member 'data' in 'x', which is of non-class type 'Foo()'
x().data(); // compiles!!! but linking fails with: undefined reference to `x()'
x()->data();// doesn't compile: base operand of '->' has non-pointer type 'Foo'
我想我只是对在 x 之后添加 (( 有什么作用感到困惑,以及为什么语言允许这样做? 这是允许的和/或有用的吗? 似乎也没有在堆栈上分配 Foo 实例,因为即使使用 -Wunused-variable,也不会发生关于 x 的警告Foo x();
相反,以下两个都无法编译:
Foo *x = new Foo; // error: no matching function for call to 'Foo::Foo()
Foo *y = new Foo();// error: no matching function for call to 'Foo::Foo()
这似乎更一致,我不明白Foo x();
是怎么回事
编辑:好的,想通了。 Foo x()
;是函数 'x' 的原型,它不带任何参数并返回一个 Foo。 由于该函数没有在任何地方定义,因此尝试像Foo实例(x.data()
(或Foo指针(x->data()
(一样使用它不起作用。 x()->data()
不起作用,因为x()
是类型 Foo
,而不是指向Foo
的指针。 x().data()
编译是因为x()
返回Foo
,它有一个data
方法,但由于尚未定义函数x
,因此无法链接。 呼。
Foo x();
这不会创建 Foo 类型的对象x
。相反,您声明的是一个返回类型为 Foo
的函数x
。
此C++常见问题解答条目应该会有所帮助。
现在
Foo *x = new Foo; // error: no matching function for call to 'Foo::Foo()
new Foo
调用默认构造函数,而您没有构造函数,这是错误的原因。如果类提供构造函数,则编译器不提供默认构造函数。
Foo x();
不是Foo类型的默认构造对象,而是一个函数声明:一个名为x的函数,不带任何参数并返回Foo。谷歌搜索"最令人烦恼的解析"。
Foo类型的默认构造对象将简单地Foo x;
。
相关文章:
- 在C++中将函数压缩为两种方式
- 如何使映射键具有两种不同的数据类型?
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 如何构造可以调用和返回两种不同类型的模板
- 这两种C++语法之间有什么区别?
- 为什么两种不同的对象初始化方式给出不同的输出
- std::cin 从控制台获取两种不同的变量类型,'storing'以后使用第二种类型?
- 定义类模板构造函数的两种方法之间的区别
- 初始化类的两种方法?
- C++ 一个函数,可以根据接受的值返回两种类型之一
- 如何检查程序员在C++中提供的两种不同格式的输入
- C++指针中的这两种类型的值分配有什么区别?
- 如何在c ++中以一行(水平)打印两个文件的数据?如给定的.这两种形式来自两个不同的文本文件
- 有没有办法让C++函数采用具有相同成员的两种不同类型?
- C++两种类型相互依赖
- 两种情况下的输出不应该相同吗?
- C++:这两种将数字写入矩阵的方式之间是否存在显着的速度差异?
- 如何获得C - 模板状行为,但仅允许实例化两种特定类型
- 声明类实例的两种方式的不同之处