在c++中,can对象为空
In C++, can objects be null?
我是这样做的:我有一个简单的类:
class Person{
public:
Person();
}
And in my main:
int main() {
Person myPer = NULL;
}
这是不可能的,因为c++不允许这样做:
int main() {
Person* perPtr = NULL;
Person myPer = *perPtr; // corrected, it was &perPtr(typo error) before answers
}
这个编译得很好,正如我所看到的,我确实能够有一个NULL对象。那么,它是否违反了c++中只有指针可以为空的规则?或者c++中有这样的规则吗?第二个是在我写了这段代码之后,我添加了一个if语句检查myPer是否为NULL,但这给了我错误。这是否说明c++并不喜欢NULL对象的概念不管你怎么把对象设为NULL。
对象不能为空,只有指针可以。你的代码是不正确的,不能编译,因为它试图将一个Person
从一个指针初始化为一个指向Person
的指针。如果您要将代码更改为
Person* perPtr = NULL;
Person myPer = *perPtr;
那么它将尝试从指向Person
的解引用空指针中初始化Person
,这是未定义的行为(并且很可能崩溃)。
如果需要使用习惯用法,对象可能处于NULL
状态,则可以使用Boost.Optional
:
boost::optional< Person > myPer = boost::none;
if( myPer )
{
myPer->do_something();
}
这是未定义的行为。 c++引用不能合法地设置为NULL。如果你想要一个"可空引用",使用指针。
这被称为未定义行为。当您试图解引用NULL
或获取NULL
的地址时,可能会出现意想不到的结果。
从语法上讲,引用是指针的一种更好的表达方式。
你可以创建一个状态为"NULL"的类。
。一个拥有其他东西的类,如文件句柄、窗口句柄或其他任何东西,因此它可以为空或不为空。
您可以在任何字符串类或容器类中看到这一点。
if (x.empty())…
但是"is null"的概念仅限于指针和智能指针(或任何您覆盖以支持此类用例的类)。
在c++中不能有NULL对象。你的第一次尝试是试图设置一个对象等于一个指针,因此失败。
你可以有一个NULL指针,引用只是语法略有不同的指针。
您可以取消引用NULL指针(编译器将允许您这样做),但这是未定义的行为。如果幸运的话,解引用NULL会崩溃,所以您知道发生了什么。
我不会说下面的是不可能的,因为c++不允许:
int main() {
Person myPer = NULL;
}
这是可能的,c++也允许这样做。这完全取决于您如何定义Person
类。例如,如果类Person
有如下所示的构造函数:
class Person
{
public:
Person(char *) {}
};
那么Person myPer = NULL
将编译得很好:http://www.ideone.com/586Pf
现在,这样的类有多大用处取决于你。人们可以利用上述事实,并可能提出酷和有用的(实用程序)类。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 在创建完整对象之前编写 if-can-add check 方法的正确方法?
- 在c++中,can对象为空
- Java - Can调用系统.Gc两次,释放底层对象两次