如果我们用一个构造函数转换一个值,是否还需要复制构造函数来复制新创建的临时对象?
If we convert a value with one constructor, will there also be copy constructor needed to copy the newly created temp object?
我无法理解这个主题,所以这可能是一个愚蠢的问题,但我仍然想知道:
当我们有一个函数,例如:
void func(const StringClass & param1, const StringClass & param2);
然后我们传递给函数,例如,一个 C 字符串:
func("test", test);
其中"test"
是一个C字符串,test
是我们StringClass
的一个对象。
假设我们的 StringClass
定义了一个复制构造函数和一个转换构造函数,它可以将我们的 "test"
C 字符串转换为 StringClass
对象。我已经测试过了,我所看到的是,只有转换发生而不是复制,而对于另一个对象,只有我理解的赋值,因为我们通过引用传递它。如果我们的函数是这样声明的:
void func(const StringClass param1, const StringClass param2);
并且我们仍然传递之前的参数func("test", test)
,然后第一个参数被转换,但没有调用复制构造函数。并调用第二个参数复制构造函数。
但我的问题是 - 会一直这样吗?我的意思是,其他编译器可以这样处理它:将 "test"
C 字符串转换为 StringClass
对象,然后使用复制构造函数将临时对象复制到函数内的 param
参数,或者一个转换就足够了,因为它无论如何都会创建一个临时对象,所以它不会在编译器之间有所不同?
作为第一个提示,您可以添加一个复制构造函数来打印一些内容以查看它是否被调用:
#include <iostream>
struct foo {
template <size_t n>
foo(const char(&str)[n]){
std::cout << "converting constructor\n";
}
foo(const foo& f){
std::cout << "copy constructor\n";
}
};
void bar(foo){}
int main() {
bar("asdf");
}
converting constructor
本例中没有调用拷贝构造函数。这只是一个提示,因为它是一个特定编译器和一个特定 C++ 标准的输出。但是,一旦通过调用转换构造函数创建了 foo
,就没有理由调用复制构造函数了。字符串文字 "asdf"
被转换为 foo
就是这样。代码中没有额外的副本,因此编译器不应创建另一个副本。
我无法理解这个主题,所以这可能是一个愚蠢的问题,但我仍然想知道:
当我们有一个函数,例如:
void func(const StringClass & param1, const StringClass & param2);
然后我们传递给函数,例如,一个 C 字符串:
func("test", test);
其中"test"
是一个C字符串,test
是我们StringClass
的一个对象。
假设我们的 StringClass
定义了一个复制构造函数和一个转换构造函数,它可以将我们的 "test"
C 字符串转换为 StringClass
对象。我已经测试过了,我所看到的是,只有转换发生而不是复制,而对于另一个对象,只有我理解的赋值,因为我们通过引用传递它。如果我们的函数是这样声明的:
void func(const StringClass param1, const StringClass param2);
并且我们仍然传递之前的参数func("test", test)
,然后第一个参数被转换,但没有调用复制构造函数。并调用第二个参数复制构造函数。
但我的问题是 - 会一直这样吗?我的意思是,其他编译器可以这样处理它:将 "test"
C 字符串转换为 StringClass
对象,然后使用复制构造函数将临时对象复制到函数内的 param
参数,或者一个转换就足够了,因为它无论如何都会创建一个临时对象,所以它不会在编译器之间有所不同?
作为第一个提示,您可以添加一个复制构造函数来打印一些内容以查看它是否被调用:
#include <iostream>
struct foo {
template <size_t n>
foo(const char(&str)[n]){
std::cout << "converting constructor\n";
}
foo(const foo& f){
std::cout << "copy constructor\n";
}
};
void bar(foo){}
int main() {
bar("asdf");
}
converting constructor
本例中没有调用拷贝构造函数。这只是一个提示,因为它是一个特定编译器和一个特定 C++ 标准的输出。但是,一旦通过调用转换构造函数创建了 foo
,就没有理由调用复制构造函数了。字符串文字 "asdf"
被转换为 foo
就是这样。代码中没有额外的副本,因此编译器不应创建另一个副本。