Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;这是复制构造函数吗?_C++ - Fatal编程技术网

C++ c++;这是复制构造函数吗?

C++ c++;这是复制构造函数吗?,c++,C++,这是我从学校读到的。它说这是一个隐式类型转换。从甲级到乙级。 我想问,这也是复制构造函数的一个例子吗? 谢谢。不,它不是复制构造函数。复制构造函数将一个类型的对象复制到另一个相同类型的对象中: class A {}; class B { public: B (A a) {} }; A a; B b=a; 作为旁注,如果您需要一个复制构造函数,那么您需要一个析构函数和赋值运算符,可能还需要一个交换函数 什么是转换函数。它是一个构造函数,允许您将a类型的对象转换为B类型的对象 B::B(cons

这是我从学校读到的。它说这是一个隐式类型转换。从甲级到乙级。 我想问,这也是复制构造函数的一个例子吗?
谢谢。

不,它不是复制构造函数。复制构造函数将一个类型的对象复制到另一个相同类型的对象中:

class A {};
class B { public: B (A a) {} };

A a;
B b=a;
作为旁注,如果您需要一个复制构造函数,那么您需要一个析构函数和赋值运算符,可能还需要一个交换函数

什么是转换函数。它是一个构造函数,允许您将
a
类型的对象转换为
B
类型的对象

B::B(const B& b)
{
    // ...
}

不,它不是复制构造函数。复制构造函数将一个类型的对象复制到另一个相同类型的对象中:

class A {};
class B { public: B (A a) {} };

A a;
B b=a;
作为旁注,如果您需要一个复制构造函数,那么您需要一个析构函数和赋值运算符,可能还需要一个交换函数

什么是转换函数。它是一个构造函数,允许您将
a
类型的对象转换为
B
类型的对象

B::B(const B& b)
{
    // ...
}

不,复制构造函数具有以下形式

void f(const B& obj);

void g()
{
    A obja;
    B objb = obja;
    f(obja);
}

不,复制构造函数具有以下形式

void f(const B& obj);

void g()
{
    A obja;
    B objb = obja;
    f(obja);
}

否,从对象创建新变量时会调用复制构造函数。您有两个不同类型的对象。

否,当您从对象创建新变量时,将调用复制构造函数。你有两个不同类型的对象。

B=a
意味着使用了复制构造函数,就好像您键入了
B=B(a)
bb((B(a))。也就是说,编译器将检查B是否具有可访问的(公共)副本构造函数—是用户定义的还是编译器提供的默认构造函数。不过,这并不意味着必须实际调用复制构造函数,因为该语言允许编译器优化对构造函数的冗余调用

通过向B添加用户定义的复制构造函数并使其不可访问,同一代码应产生编译器错误:

class A
{
public:
  A(const A& in) {...}
}

线
B=a
意味着使用了复制构造函数,就好像您键入了
B=B(a)
bb((B(a))。也就是说,编译器将检查B是否具有可访问的(公共)副本构造函数—是用户定义的还是编译器提供的默认构造函数。不过,这并不意味着必须实际调用复制构造函数,因为该语言允许编译器优化对构造函数的冗余调用

通过向B添加用户定义的复制构造函数并使其不可访问,同一代码应产生编译器错误:

class A
{
public:
  A(const A& in) {...}
}


隐式构造函数是任何没有标记为
explicit
@wilhelmtell的构造函数,我认为它只适用于只有一个参数且没有标记为explicit的构造函数;这和“转换函数”不一样吗?@zneak如果除了一个参数外,其他所有参数都有默认值,那么你可以将一个具有多个参数的非显式构造函数作为隐式转换。你不也将这个函数称为“转换”函数吗?在好年头,它们不是被称为隐式构造函数吗?隐式构造函数是可以的未标记为
explicit
@wilhelmtell的构造函数我认为它只适用于只有一个参数且未标记为explicit的构造函数;这与“转换函数”不一样吗?@zneak如果除一个参数外,其他所有参数都有默认值,则可以将具有多个参数的非显式构造函数作为隐式转换。您不也将此函数称为“转换”函数吗?这里发生的转换类型是什么?@Mr.TAMER那里根本没有转换。这是一种转换。这两者之间有一个显著的区别:强制转换是您在编译时与编译器达成一致的事情。转换是在运行时发生的事情。一个cast接受一系列位并重新解释它们的含义;一点也不改变。转换是一组操作位的操作,将一种形式转换为另一种形式。@wilhelmtell:谢谢,我不知道,经验教训:)@wilhelmtell:你的评论是错误的。强制转换是一种语法结构,需要显式转换,但这种转换(不一定)是一种位重新解释。例如,在
double test(intx){double y=(double)x;return y;}
中有一个整数到double的转换。cast调用的运行时转换的结果基于传入的
int
的值。位模式不太可能被保留。这里发生的类型是什么?@Mr.TAMER那里根本没有类型转换。这是一种转换。这两者之间有一个显著的区别:强制转换是您在编译时与编译器达成一致的事情。转换是在运行时发生的事情。一个cast接受一系列位并重新解释它们的含义;一点也不改变。转换是一组操作位的操作,将一种形式转换为另一种形式。@wilhelmtell:谢谢,我不知道,经验教训:)@wilhelmtell:你的评论是错误的。强制转换是一种语法结构,需要显式转换,但这种转换(不一定)是一种位重新解释。例如,在
double test(intx){double y=(double)x;return y;}
中有一个整数到double的转换。cast调用的运行时转换的结果基于传入的
int
的值。位模式不太可能被保留。