C++ 按地址复制构造函数
我有两个复制构造函数C++ 按地址复制构造函数,c++,pass-by-reference,copy-constructor,C++,Pass By Reference,Copy Constructor,我有两个复制构造函数 Foo(Foo &obj){ } Foo(Foo *obj){ } 第二个复制构造函数将在何时调用?不,您没有-您有一个复制构造函数 Foo( Foo * obj ); 不是复制构造函数,它永远不会被C++编译器使用。您当然可以自己使用它: Foo a; Foo b( & a ); // use your constructor 还要注意,您的真实副本构造函数应该声明为 Foo( const Foo & f ); 尽管缺少const并
Foo(Foo &obj){
}
Foo(Foo *obj){
}
第二个复制构造函数将在何时调用?不,您没有-您有一个复制构造函数
Foo( Foo * obj );
不是复制构造函数,它永远不会被C++编译器使用。您当然可以自己使用它:
Foo a;
Foo b( & a ); // use your constructor
还要注意,您的真实副本构造函数应该声明为
Foo( const Foo & f );
尽管缺少const并不妨碍它成为复制构造函数。不,你没有-你只有一个复制构造函数
Foo( Foo * obj );
不是复制构造函数,它永远不会被C++编译器使用。您当然可以自己使用它:
Foo a;
Foo b( & a ); // use your constructor
还要注意,您的真实副本构造函数应该声明为
Foo( const Foo & f );
尽管缺少const并不妨碍它成为复制构造函数。第二个不是复制构造函数。它是一个构造函数,当您创建一个新的Foo对象时,会调用它,并将一个指向Foo的指针作为参数
Foo foo0;
Foo foo1 = foo0; // Calls copy constructor
Foo foo2(foo0); // Calls copy constructor
Foo foo3(&foo0); // Calls constructor taking a pointer as parameter
第二个不是复制构造函数。它是一个构造函数,当您创建一个新的Foo对象时,会调用它,并将一个指向Foo的指针作为参数
Foo foo0;
Foo foo1 = foo0; // Calls copy constructor
Foo foo2(foo0); // Calls copy constructor
Foo foo3(&foo0); // Calls constructor taking a pointer as parameter
其中一个构造函数是复制构造函数,另一个只是普通构造函数 如果从指向Foo的指针显式初始化Foo,或者在需要从指向Foo的指针转换为r值Foo的其他情况下(例如参数传递和函数返回),则将调用第二个
这通常是一个坏主意,有这样一个隐式转换;当您不希望它发生时,它可能会发生,并且很容易在运行时将编译错误中的琐碎错误转化为异常行为。您的构造函数之一是复制构造函数,另一个只是普通构造函数 如果从指向Foo的指针显式初始化Foo,或者在需要从指向Foo的指针转换为r值Foo的其他情况下(例如参数传递和函数返回),则将调用第二个 这通常是一个坏主意,有这样一个隐式转换;它可能发生在您不期望的情况下,并且可能会在运行时将编译错误中的琐碎错误转化为异常行为。撇开第二个构造函数不是复制构造函数不谈,您实际上想知道第二个构造函数何时被调用 FooFoo*obj;构造函数是一个单参数构造函数-因为它没有被显式关键字标记,所以它提供了从Foo*到Foo的隐式转换。它可以在任何时候被调用,其中Foo*被用来代替Foo或const Foo&如果它被意外调用,那么几乎可以肯定发生了什么 通常,单参数构造函数应该是其他答案解释过的复制构造函数,或者应该标记为显式。提供隐式转换的构造函数应该少用。撇开第二个构造函数不是复制构造函数不谈,实际上您想知道第二个构造函数何时被调用 FooFoo*obj;构造函数是一个单参数构造函数-因为它没有被显式关键字标记,所以它提供了从Foo*到Foo的隐式转换。它可以在任何时候被调用,其中Foo*被用来代替Foo或const Foo&如果它被意外调用,那么几乎可以肯定发生了什么
通常,单参数构造函数应该是其他答案解释过的复制构造函数,或者应该标记为显式。提供隐式转换的构造函数应该谨慎使用。我的错误是,第二个不是复制构造函数,只是想知道第二个函数何时被调用?foofoo3&foo0;解决它是我的错第二个不是复制构造函数只是想知道第二个函数什么时候被调用?foofoo3&foo0;解决它您可以添加案例Foo*pfoo=newfoo;Foo foo4foo;您可以添加案例Foo*pfoo=newfoo;Foo foo4foo;