C++中的set对象=null是什么?

C++中的set对象=null是什么?,c++,object,null,C++,Object,Null,我有一个函数,类似于: MyClass1 mc1, mc0; //Single Object MyClass2 mc2; //vector of MyClass1 mc1.Init(1); mc2.Add(mc1); mc1 = mc0; mc1.Init(2); mc2.Add(mc1); mc1 = mc0; //so on...... 实际上,我希望在步骤开始之前设置MC1= null,但是不能在C++中这样做。所以我保留了一个从未初始化过的mc0来做这件事。 不要认为这是一个优雅的

我有一个函数,类似于:

MyClass1 mc1, mc0; //Single Object
MyClass2 mc2; //vector of MyClass1

mc1.Init(1);
mc2.Add(mc1);
mc1 = mc0;

mc1.Init(2);
mc2.Add(mc1);
mc1 = mc0;
//so on......
实际上,我希望在步骤开始之前设置MC1= null,但是不能在C++中这样做。所以我保留了一个从未初始化过的mc0来做这件事。 不要认为这是一个优雅的解决方案。 我的背景主要是C和ASP.NET,我认为C++的非托管属性是我不能做Obj= null的原因。对吗?

这个怎么样:

mc1 = MyClass();
这是假设MyClass有一个默认构造函数。

这个怎么样:

mc1 = MyClass();

这是假设MyClass有一个默认构造函数。在C++中,

不存在将对象设置为null的方法,另一方面,可以将指针设置为NULL。根据您的设计目标,您可能需要开始使用指针,或者调用mc1.Init0;假设0是NULL的意思


编辑:另一个答案建议调用mc1=MyClass;,这也是一个可行的选择,如果你不关心C++中包含的值,或者你知道默认构造函数将以一种方式初始化变量,使得默认构造变量是NULL

< P>的一个可接受的替代品,C++中没有任何方法将一个对象设置为NULL。将指针设置为NULL。根据您的设计目标,您可能需要开始使用指针,或者调用mc1.Init0;假设0是NULL的意思


编辑:另一个答案建议调用mc1=MyClass;,这也是一个可行的选择,如果您不关心mc1中包含的值,或者您知道默认构造函数将以一种方式初始化变量,即使用默认构造的变量可以替代NULL,这与语言是否被管理无关,而是用C++对对象引用的不同方法。在C中,声明MyClass mc;将生成一个可能引用MyClass或为null的变量。在C++中,MyClass mc;生成一个MyClass变量-对象实例完全包含在该变量中,因此,该变量不能为null。如果需要引用,通常会使用指针:MyClass*mc=NULL;或者MyClass*mc=newmyclass

这与语言是否被管理无关,而是与C++对对象引用的不同方法有关。在C中,声明MyClass mc;将生成一个可能引用MyClass或为null的变量。在C++中,MyClass mc;生成一个MyClass变量-对象实例完全包含在该变量中,因此,该变量不能为null。如果需要引用,通常会使用指针:MyClass*mc=NULL;或者MyClass*mc=newmyclass

MyClass*mc1是指向类的指针,可以指定给0

MyClass mc1是类的一个距离,因为没有用int重载=运算符,所以不能为它赋值0

在C中,只有指针指向类,所以C++中的C类MyC类MC1等价于MyCys*MC1

< P> MyCype *MC1是指向类的指针,可以被分配到0

MyClass mc1是类的一个距离,因为没有用int重载=运算符,所以不能为它赋值0


<>在C中只有指针指向类,所以C++中的C类MyC类MC1等价于MyCys*MC1

< P>。这里的每个人都说过,C++中,你不能也不能简单地将null分配给对象实例。但是,可以为指向对象的指针指定NULL。在VS2010中,使用VC10.0编译器,您可以将NULL替换为NULL ptr。VC10.0编译器对这两种方法的使用要求更严格一些。无论如何,这似乎不是你在这里需要的。在您的情况下,应该让mc1调用某种方法,将其重置为已知的预定义状态


注意:我认为您是在试图避免重建MyClass1对象?如果使用std::vector并将这些实例“添加”到中,那么对象会被重新复制,因为vector会复制放入其中的内容。如果您想进一步加快速度,可以保留指向对象实例的指针向量。但这是一个全新的游戏,也有其他的后果。

就像这里的其他人都说过,在C++中,你不能而且不能简单地将null分配给对象实例。但是,可以为指向对象的指针指定NULL。在VS2010中,使用VC10.0编译器,您可以将NULL替换为NULL ptr。VC10.0编译器对这两种方法的使用要求更严格一些。无论如何,这似乎不是你在这里需要的。在您的情况下,应该让mc1调用某种方法,将其重置为已知的预定义状态

注意:我认为您是在试图避免重建MyClass1对象?如果您使用std::vector并将这些实例“添加”到中,那么当vector进行复制时,对象将被重新复制 里面放了什么。如果您想进一步加快速度,可以保留指向对象实例的指针向量。但是这是一个全新的游戏,并且还有其他的后果。

C++中,MyCyraseMC1实际上创建了MyCase1类型的对象MC1。如果希望变量最初具有null值,则应将mc1设置为MyClass1类型的指针,而不是object类型的指针。下面是一个简单的例子,告诉您不要忘记,您将负责使用delete清理对象

MyClass* mc1 = null;
....
mc1 = new MyClass();
mc1->Init(1);
mc2.Add(*mc1); 
// if you are adding object, if your vector hold pointer, then it will be 
// mc2.Add(mc1);
.......
mc1 = null;
在C++中,MyCyr1 MC1实际上创建了MyCase1类型的对象MC1。如果希望变量最初具有null值,则应将mc1设置为MyClass1类型的指针,而不是object类型的指针。下面是一个简单的例子,告诉您不要忘记,您将负责使用delete清理对象

MyClass* mc1 = null;
....
mc1 = new MyClass();
mc1->Init(1);
mc2.Add(*mc1); 
// if you are adding object, if your vector hold pointer, then it will be 
// mc2.Add(mc1);
.......
mc1 = null;

<>你不在C++中那样做。要将对象添加到向量,请执行以下操作:

std::vector<MyClass1>   mc2;

mc2.push_back(MyClass1(1));
mc2.push_back(MyClass1(2));

不需要创建中间引用,也不需要释放它们。

在C++中,你不会那样做。要将对象添加到向量,请执行以下操作:

std::vector<MyClass1>   mc2;

mc2.push_back(MyClass1(1));
mc2.push_back(MyClass1(2));

不需要创建中间引用,也不需要释放它们。

用于背景知识,在值语义和参考语义之间的差异上阅读,并注意到C++中的值语义通常是首选的,而它们在C或java中不存在。与以往一样:不要试图在C++中不加反思地翻译和使用C习语,学习C++并使用适当的习语。对于背景知识,在价值语义和参考语义之间的差异上进行阅读,并注意到在C++中,语义值通常是首选的,而在C或java中则不存在。一如既往:不要试图在C++中不加反思地翻译和使用C习语,学习C++并使用适当的成语。m1.初始。。。;m1.initb。。。;mc2.push_backmc1;而不是使用构造函数。有没有一些可能的风格像你的建议?实际上我用的是我的m1类;m1.初始。。。;m1.initb。。。;mc2.push_backmc1;而不是使用构造函数。是否有一些可能的风格像你的建议?如果我应该使用MyClass1*mc1*mc1.Init;mc2.推回*mc1*mc=null;?之后,MC1是否已经被指出来从内存中删除了?@布罗洛维哈:基于这些问题,我强烈建议你读一本C++书,而不是试图通过尝试编写类似C代码的方法来学习C++。C++中的内存管理和C语言有很大的不同,如果你不正确地学习它,你会反复地在自己的脚上开枪。@布罗洛维哈库:关于问题本身:*优先于。所以,当通过指针访问一个成员时,你必须写*MCinit,或者优先MC1~init。请注意,如果将*mc1推入向量,则是插入了mc1的副本;您可能需要一个指针向量。此外,对象本身不能被设置为null,但是指针可以:MC=null。我在5小时内阅读了一本简单的C++书籍。我想这就是问题的根源。谢谢你的建议。我会找更多的。@hbrlovehaku:我会找一本需要5个多小时阅读的书。:-如果您精通其他语言,您可以专注于面向对象、构造函数、指针和内存管理。请记住,无论何时,在C++中,都有一个对象类型的非指针变量,例如MyCaseMC1;它的行为将与C中对象类型的变量的行为非常不同*mc1.Init;mc2.推回*mc1*mc=null;?之后,MC1是否已经被指出来从内存中删除了?@布罗洛维哈:基于这些问题,我强烈建议你读一本C++书,而不是试图通过尝试编写类似C代码的方法来学习C++。C++中的内存管理和C语言有很大的不同,如果你不正确地学习它,你会反复地在自己的脚上开枪。@布罗洛维哈库:关于问题本身:*优先于。所以,当通过指针访问一个成员时,你必须写*MCinit,或者优先MC1~init。请注意,如果将*mc1推入向量,则是插入了mc1的副本;您可能需要一个指针向量。此外,对象本身不能被设置为null,但是指针可以:MC=null。我在5小时内阅读了一本简单的C++书籍。我想这就是问题的根源。谢谢你的建议。我会找更多的。@hbrlovehaku:我会找一本需要5个多小时阅读的书。:-如果您精通其他语言,您可以专注于面向对象、构造函数、指针和内存管理。请记住,无论何时,在C++中,都有一个对象类型的非指针变量,例如MyCaseMC1;它的行为与C中对象类型的变量的行为非常不同。