C++ 中的对象初始化语法
Object initialization syntax in C++
我在尝试初始化构造函数时注意到一些奇怪的错误。如果我只是展示它们,这将是最简单的。
#include <iostream>
class MyClass {
public:
int var1, var2, var3;
MyClass() {
var1, var2, var3 = 0;
}
MyClass(int one, int two, int three) {
var1 = one;
var2 = two;
var3 = three;
}
};
int main()
{
MyClass object1(5, 6, 7);
std::cout << object1.var1; // This works
MyClass object2();
std::cout << object2.var1; //Error object must have class type.
MyClass object3 = MyClass();
std::cout << object3.var1; //Now it works for some reason
delete &object1;
MyClass ojbect1(5, 6, 7); //error redefinition; multiple initialization
}
如您所见,出于某种原因,当我初始化 object2 时,不会打印值,除非与 object3 一样,语法写为 MyClass object3 = MyClass();
此外,当我删除 object1 时,我必须使用 & 运算符。考虑到这个问题 Deleting an object in C++ 他们不使用符号,这让我感到惊讶。
最后,当我尝试重新初始化 myobject 时,编译器抱怨有多个定义。我尝试省略 MyClass 关键字,但它仍然不允许。
现在我当然可以通过各种解决方法让程序做我想做的事,但我不明白为什么这些事情不能按照我在这里写的方式完成.
MyClass myobj2();
不是你想的那样。它声明了一个名为 myobj2
的函数,即 returns 和 MyClass
。
MyClass myobj(5, 6, 7);
导致错误,因为即使你之前删除了myobj
,它仍然被声明为MyClass
类型。删除对象不会取消声明变量。如果您删除它并想重新创建它,请执行以下操作:
myobj = MyClass(5,6,7);
但是,删除本地对象是无稽之谈。您不必删除一旦超出范围就会被删除的对象。实际上你应该只 delete
通过 new
创建的对象,否则你有未定义的行为。
MyClass object2();
std::cout << object2.var1;
不起作用,因为 object2
被解析为 "a function that takes no arguments and returns a MyClass
"。看
Most vexing parse: why doesn't A a(()); work?
delete &object1;
是未定义行为的原因。您只能 delete
使用 new
创建的对象。
MyClass object1(5, 6, 7);
是编译器告诉的问题。您不能在同一范围内重新声明该名称。如果你想让它有一个新的值,你可以使用:
object1 = MyClass(5, 6, 7);
我在尝试初始化构造函数时注意到一些奇怪的错误。如果我只是展示它们,这将是最简单的。
#include <iostream>
class MyClass {
public:
int var1, var2, var3;
MyClass() {
var1, var2, var3 = 0;
}
MyClass(int one, int two, int three) {
var1 = one;
var2 = two;
var3 = three;
}
};
int main()
{
MyClass object1(5, 6, 7);
std::cout << object1.var1; // This works
MyClass object2();
std::cout << object2.var1; //Error object must have class type.
MyClass object3 = MyClass();
std::cout << object3.var1; //Now it works for some reason
delete &object1;
MyClass ojbect1(5, 6, 7); //error redefinition; multiple initialization
}
如您所见,出于某种原因,当我初始化 object2 时,不会打印值,除非与 object3 一样,语法写为 MyClass object3 = MyClass();
此外,当我删除 object1 时,我必须使用 & 运算符。考虑到这个问题 Deleting an object in C++ 他们不使用符号,这让我感到惊讶。
最后,当我尝试重新初始化 myobject 时,编译器抱怨有多个定义。我尝试省略 MyClass 关键字,但它仍然不允许。
现在我当然可以通过各种解决方法让程序做我想做的事,但我不明白为什么这些事情不能按照我在这里写的方式完成.
MyClass myobj2();
不是你想的那样。它声明了一个名为 myobj2
的函数,即 returns 和 MyClass
。
MyClass myobj(5, 6, 7);
导致错误,因为即使你之前删除了myobj
,它仍然被声明为MyClass
类型。删除对象不会取消声明变量。如果您删除它并想重新创建它,请执行以下操作:
myobj = MyClass(5,6,7);
但是,删除本地对象是无稽之谈。您不必删除一旦超出范围就会被删除的对象。实际上你应该只 delete
通过 new
创建的对象,否则你有未定义的行为。
MyClass object2();
std::cout << object2.var1;
不起作用,因为 object2
被解析为 "a function that takes no arguments and returns a MyClass
"。看
Most vexing parse: why doesn't A a(()); work?
delete &object1;
是未定义行为的原因。您只能 delete
使用 new
创建的对象。
MyClass object1(5, 6, 7);
是编译器告诉的问题。您不能在同一范围内重新声明该名称。如果你想让它有一个新的值,你可以使用:
object1 = MyClass(5, 6, 7);