object* foo(bar) 有啥作用?

Posted

技术标签:

【中文标题】object* foo(bar) 有啥作用?【英文标题】:What does object* foo(bar) do?object* foo(bar) 有什么作用? 【发布时间】:2009-04-30 14:03:52 【问题描述】:

对于某些 C 类:

C* a = new C();

C* b(a);  //what does it do?

C* b = a;  //is there a difference?

【问题讨论】:

【参考方案1】:

C* b(a) 和 C* b = a 是等价的。与许多语言一样,有不止一种方法可以做到这一点......

【讨论】:

回想起来应该使用 int 来消除混乱。 int a = 5; int* b = &a; int* c(&a);我想这些是等价的,并且指针 b 和 c 都指向相同的值 a。 这么简单的一个问题竟然会产生这么多的错误回答,这有点可怕。 它们不是 100% 等效的。它们在本例中是等价的,因为所有类型都相同。但是,在涉及具有转换构造函数的类类型时,它们并不等效。最好在你的答案中解释这一点(假设它被选为正确的)。 在提问者询问的情况下,它们是 100% 等价的。如果您想发布替代答案,请随意。 我了解(并已发布)。我只是觉得,鉴于您的答案已被选中,您可能只需记下“仅针对此特定示例,这是正确的”。【参考方案2】:

注意在

C* a = new C();
C* b(a);  

b 是指向与 a 具有相同值的 C 对象的指针。不过,

#include "somefile.h"
C* b(a);  

我们可以很容易地将 b 定义为一个函数,它接受一个类型为 a 的对象,并返回一个指向 C 的指针。

【讨论】:

【参考方案3】:

标准描述的不同类型的初始化是8.5,而这两个具体是在8.5/12下。

C* b(a);  //what does it do?

这称为直接初始化。如果“b”具有类类型,则编译器将使用“a”作为参数对 C 中的构造函数执行重载解析。对于指针类型,它只是将 'b' 初始化为 'a'。

C* b = a;  //is there a difference?

标准确实认为这些在某些情况下是不同的,上面的语法称为复制初始化。至于直接初始化,因为 'b' 不是类类型,则使用 'a' 的值进行初始化。如果 'a' 和 'b' 是相同的类类型,则使用直接初始化

如果 'b' 是类类型,而 'a' 具有不同的类型(或不是类),则规则略有不同 (8.5/14-b1.b3)。所以对于下面的代码:

C b = a;

首先,尝试将“a”转换为“C”类型,然后使用此临时对象初始化“b”。这很重要,因为您可能会遇到 直接初始化 成功但 复制初始化 失败的情况:

class A 
public:
  operator int ();
;

class B 
public:
  B (int);
;

void foo ()

  A a;
  B b1 (a);  // Succeeds
  B b2 = a;  // Fails

【讨论】:

【参考方案4】:
    C* a = 新 C();现在它正在创建一个指针 C型,也分配新的 使用 new 关键字记忆.... 以下语句取决于 您的构造函数逻辑。 C* b(a); //它有什么作用? 您的第一个和第三个声明是 相等的。 C* b = a; //有没有 区别?

【讨论】:

1. C* a = new C() 是完全有效的 C++ 语法。 2. 嗯? 3. 正确。 是的,这完全取决于您的构造函数逻辑,如果您将 a 复制到 b 中,则所有三个都相同,但是您提供的信息似乎 1 和 3 完全指向同一个位置在记忆中。 我没有投反对票,但是您的第一点和第二点都是错误的-原始语法是正确的,并且 C * b(a) 中不涉及构造函数。 如果我们在谈论 C a; C b(a);,那么就会涉及到一个拷贝构造函数。不过,我们谈论的是指针,而不是对象。 @Syed,b 是一个指针。 C++ 中的指针没有构造函数,它与 long 非常相似(从物理上讲)。它基本上是一个数字;一个地址。 “C * b(a);”类似于“long m(n)”。不涉及复制构造函数。如果 n 的值为 14560,则 m 的值为 14560。类似地,如果“a”的值为 0x45000001h,则“b”的值为 0x45000001h。这就是你关于构造函数逻辑的答案不正确的原因。【参考方案5】:

第一个创建一个新的 C 实例并将其地址放入 a。

第二个是指向函数的声明。该指针可以指向任何接受 a 类型参数的函数,并返回指向 C 类型对象的指针。

第三个声明b,一个指向C类型对象的指针,并用a初始化它。

【讨论】:

@Neil 我发现第三个是正确的,除了“C”之后可能缺少逗号 (,)。 @daniel - 不,不涉及分配,只涉及初始化 - 区分两者很重要。 @Neil,好的,你说得对。我认为这是我有时用通用语言可能会犯的错误,因为我乍一看并没有发现它。 “int i=8;”不声明整数“i”并为其分配 8,而是使用 8 对其进行初始化。

以上是关于object* foo(bar) 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

类的内置方法

type与instance区别

Object.fromEntries

面向对象2

假期(面向对象相关)

instance与type区别