在C++中,对象和指向对象的指针之间有什么区别?

mor*_*des 7 c++ pointers object

在java和objective-c中,表示对象的变量通常是指向该对象的指针.但是,似乎在C++中,非指针类型保持对象是很常见的.这两者有什么区别?

如果我将一个struct作为参数传递给一个函数,我相信我正在通过值传递,这意味着我实际上是在内存中创建一个新结构,并且在传递给它的函数内对该结构的更改不会影响"源"函数外的结构.但是,如果我将指针传递给结构,那么仍然只有一个原始结构,并且对于任何知道此结构的代码,对指针引用的结构的更改都是可见的.我有这个权利吗?

那么,对象有什么不同吗?当我将非指针对象传递给函数时,是否会复制整个对象?

Mat*_*lia 15

就像你说的那样.

按值传递对象时,调用其复制构造函数以生成将在函数内使用的此类对象的新实例.对这种新对象所做的更改不会反映到原始对象1.

与结构一样,默认的复制构造函数只执行原始对象的浅表副本 - 即,将其字段复制2到新实例; 在许多情况下,这是不可取的(例如,如果对象包装指针/另一个资源),那么有些类重新定义了复制构造函数或完全禁用它.这些最后一个类的对象只能通过指针或引用传递.

如果它们比指针(大小)大,或者通常如果它们的复制构造函数不"便宜",那么按值传递对象可能是昂贵的.另一方面,与指针相比,pass-by-value产生了通常的优点,即不必指定指针所有权,让被调用者对对象做任何想做的事情等.

请注意,按值传递对象会导致多态性丧失.这是因为按值接收对象的函数接收具有精确大小和类型的静态类型对象,因此任何传递派生类对象的尝试都将导致对象切片(调用基类的复制构造函数,默认情况下,只复制基类中可用的字段.

这就是为什么通常传递对象的首选方法是const引用的原因.这产生了几个优点:

  • 没有涉及副本; 被叫方将看到的对象将是呼叫时指定的对象;
  • 由于const限定符,不能对原始对象进行任何更改;
  • 但是,如果被调用者需要更改对象的副本,它仍然可以从引用中自行构造副本;
  • 没有笨拙的指针语法;
  • 多态性保留,因为幕后我们实际上传递了一个指针;
  • 对对象所有权没有太大的疑问:关于引用的一般规则是它们由调用者拥有.

  1. 就物体的"原始场"而言; 当然,如果原始对象和副本继续共享同一资源的指针/句柄,那么对一个的一些修改可能会影响另一个.

  2. 按位复制原始类型(和一般POD),而为非POD类型调用复制构造函数.