c – 为什么两个不同对象的地址应该不同?

我一直在读这个东西,一个对象的大小至少应该是1个字节( C++: What is the size of an object of an empty class?),并且有两个空对象是同一个地址有什么不对?毕竟,我们可以有两个指向同一个对象的指针.

谷歌搜索告诉我有一些关于对象身份fundemantal规则,但我找不到更详细的信息.

所以… $SUBJ.

解决方法

在同一地址处有两个对象意味着在使用指针引用它们时无法区分这两个对象.例如,在以下代码中:
EmptyClass o1;
EmptyClass o2;

EmptyClass * po = &o;
po->foo();

是应该在o1还是o2上调用foo方法

可以认为,由于这些对象没有数据而没有虚拟方法(否则它们的大小非为零),调用方法的实例并不重要.但是,当我们想要测试两个对象是否相等时(即它们是否相同),这变得更加重要:

template < typename T >
bool isSame( T const & t1,T const & t2 )
{
    return &t1 == &t2;
}

EmptyClass o1; // one object and...
EmptyClass o2; // ...a distinct object...

assert( ! isSame( o1,o2 ) ); // ...should not be one and same object!

对于一个更具体的例子,让我们假设我想将一些对象(我可以说实体)与一些值相关联,比如说在一个关联容器中:

Person you;
Person me;

// You and I are two different persons
// (unless I have some dissociative identity disorder!)
// Person is a class with entity semantics (there is only one 'me',I can't make
// a copy of myself like I would do with integers or strings)

std::map< Person *,std::string > personToName;

personToName[&you] = "Andrew_Lvov";
personToName[&me]  = "Luc Touraille";
// Oh,bother! The program confused us to be the same person,so now you and I
// have the same name!

所以是的,这一切都归结为对象身份:如果允许对象为空,则可能会剥夺他们的身份,而这种语言根本不允许(谢天谢地).

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...