代码之家  ›  专栏  ›  技术社区  ›  matt

你能为c结构提供一个复制构造函数吗

c#
  •  -2
  • matt  · 技术社区  · 4 年前

    是否有可能在C++结构中有一个拷贝构造函数,它像C++复制构造函数?因为我的坏了。

    struct TestStruct
    {
        public TestStruct(TestStruct other)
        {
            // this function is never called
        }
    }
    
    public void Afunction()
    {
        TestStruct A = new TestStruct();
        TestStruct B = new TestStruct();
    
        A = B; // in c++ copy constructor would be called here
    }
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   Rufus L    4 年前

    因为其他人已经回答了关于如何调用“复制构造函数”的问题(即将另一个实例传递给构造函数: TestStruct B = new TestStruct(A);) ,我将尝试回答其他问题。

    在C++中,在将类型分配给另一个类型的实例时,会自动调用复制构造函数。在C#中,对象的一个浅拷贝被复制,这意味着值类型成员的值被复制,引用类型成员的引用被复制。

    来自评论:“你能重载赋值运算符吗?”

    同样来自评论:“我试图用结构或类透明地替换本机值类型(int)”

    允许你自己写 user-defined conversion operators 允许在两种类型之间进行隐式(和显式)转换。这将有效地覆盖赋值运算符

    例如,如果您想从 int ,您可以执行以下操作:

    struct MyIntReplacement
    {
        public int MyValue { get; set; }
    
        public static implicit operator MyIntReplacement(int value)
        {
            return new MyIntReplacement { MyValue = value };
        }
    }
    

    现在你可以这样做:

    int someValue = 5;
    MyIntReplacement foo = someValue;
    
        2
  •  7
  •   Mahdi Tahsildari    4 年前

    这是因为您没有调用参数化构造函数。请看下面的代码:

    struct TestStruct
    {
        public string WhoIsCalled;
        public TestStruct(TestStruct other)
        {
            // this function is never called
            WhoIsCalled = "Constructor with argument";
        }
    
    }
    
    public string Afunction()
    {
    
        TestStruct A = new TestStruct();
        return A.WhoIsCalled;
    
    }
    public string Bfunction()
    {
    
        TestStruct B = new TestStruct(new TestStruct());
        return B.WhoIsCalled;
    
    }
    

    功能 ,返回null。这意味着您的代码正在使用默认的无参数构造函数。但是在 ,则代码将提供参数,因此将调用构造函数,因此 WhoIsCalled

        3
  •  1
  •   Tanveer Badar    4 年前

    C++中没有C构造函数的原因与C++调用函数/方法时的语言有关。

    C++继承了C背景,在传递参数到函数时更喜欢值(或复制)语义。

    运行在垃圾收集环境之上的C#,除其他原因外,还将其参数作为引用传递。

    void f(string s) { /* does something with s here */ }
    

    对于如何调用它有非常不同的语义。C++将复制任何对象的副本。 f(abc) 哪个C#会简单地传递它在 abc f() s 指向同一个对象。想想 用C++编写

    void f(string& s) { /* does something with s here */ }
    

    类似的推理也适用于 a = b; 在C++中引用引用时,在C++中进行拷贝分配。这也是为什么你不能超载 =

    operator =() 为了他们。