C++ object*foo(bar)是做什么的?

C++ object*foo(bar)是做什么的?,c++,pointers,C++,Pointers,对于某些C类: C* a = new C(); C* b(a); //what does it do? C* b = a; //is there a difference? C*b(a)和C*b=a是等价的。与许多语言一样,有不止一种方法可以做到这一点…第一种方法创建一个新的C实例,并将其地址放在a中 第二个是指向函数声明的指针。此指针可以指向任何接受类型a参数的函数,并返回指向类型C对象的指针 第三个声明b,一个指向C类型对象的指针,并用a初始化它 C*a=新的C();现在它正在创建

对于某些C类:

C* a = new C();

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

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

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

第一种方法创建一个新的C实例,并将其地址放在a中

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

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

  • C*a=新的C();现在它正在创建一个 类型C,也分配新的 通过使用新关键字
  • 以下陈述取决于 您的构造函数逻辑。C* b(a)//它有什么作用
  • 你的第一句和第三句话是 相等的C*b=a//有没有 区别
  • 注意,在

    C* a = new C();
    C* b(a);  
    
    b是指向与a赋值相同的C对象的指针。但是,

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

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

    标准描述了不同类型的初始化是8.5,这两个函数在8.5/12中有明确的定义

    C* b(a);  //what does it do?
    
    这称为直接初始化。如果“b”具有类类型,那么编译器将使用“a”作为参数对C中的构造函数执行重载解析。对于指针类型,它只是用“a”初始化“b”

    C* b = a;  //is there a difference?
    
    <>标准在某些情况下认为这些不同,上面的语法被称为复制初始化。至于直接初始化,因为“b”不是类类型,那么它是用值“a”初始化的。如果“a”和“b”是相同的类类型,则使用直接初始化

    如果“b”是类类型,“a”有不同的类型(类或非类),则规则略有不同(8.5/14-b1.b3)。因此,对于以下代码:

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


    1.C*A=新的C.()是完全的VALD C++语法。2.嗯?3.正确。是的,这完全取决于你的构造函数逻辑,如果你将a复制到b,那么所有三个都是相同的,但是你提供的信息,似乎1和3完全指向内存中的同一个位置。我没有否决它,但是你的第一点和第二点都是错误的——原始语法是正确的,C*b(a)中没有构造函数;C b(a);,然后会涉及到一个复制构造函数。不过,我们谈论的是指针,而不是对象。@Syed,b是指针。C++中的指针没有构造函数,它非常类似(物理上)到长。它基本上是一个数字;地址。“C*b(a);”类似于“longm(n)”。没有涉及复制构造函数。如果n的值为14560,则m的值为14560。类似地,如果“a”的值为0x45000001h,则“b”的值为0x45000001h。这就是为什么您对构造函数逻辑的回答是不正确的。retrospect应该使用int来消除混淆。INTA=5;int*b=&a;int*c&a;我想它们是等价的,指针b和c都指向相同的值a。这样一个简单的问题可能会产生这么多错误的回答,这有点可怕。它们不是100%等价的。对于本例,它们是等效的,因为所有类型都是相同的。然而,当涉及到带有转换构造函数的类类型时,它们并不等价。最好在你的回答中解释这一点(因为它被选为正确答案)。在提问者询问的情况下,它们是100%等效的。如果你想发布另一个答案,请随意。我理解(并已发布)。我只是觉得如果你的答案被选中了,你可能只需要记下“只有在这个特定的例子中,这才是正确的”。@Neil我发现第三个答案是正确的,除了“C”之后可能缺少一个逗号(,)。@daniel-不,不涉及任何作业,只有初始化-区分两者很重要。@Neil,好的,你说得对。我认为这是一个错误,我有时可能会在共同语言中犯,因为我没有第一眼看到它。“int i=8;”不声明整数“i”并为其赋值8,而是用8初始化它。
    class A {
    public:
      operator int ();
    };
    
    class B {
    public:
      B (int);
    };
    
    void foo ()
    {
      A a;
      B b1 (a);  // Succeeds
      B b2 = a;  // Fails
    }