Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++标准中定义了哪一个在这个例子中被称为构造函数或赋值操作符:< /p> #include <iostream> using namespace std; class CTest { public: CTest() : m_nTest(0) { cout << "Default constructor" << endl; } CTest(int a) : m_nTest(a) { cout << "Int constructor" << endl; } CTest(const CTest& obj) { m_nTest = obj.m_nTest; cout << "Copy constructor" << endl; } CTest& operator=(int rhs) { m_nTest = rhs; cout << "Assignment" << endl; return *this; } protected: int m_nTest; }; int _tmain(int argc, _TCHAR* argv[]) { CTest b = 5; return 0; } #包括 使用名称空间std; 类别测试 { 公众: CTest():m_nTest(0) { cout_C++_Copy Constructor_Assignment Operator - Fatal编程技术网

构造函数或赋值运算符 < >你能帮助我,在C++标准中定义了哪一个在这个例子中被称为构造函数或赋值操作符:< /p> #include <iostream> using namespace std; class CTest { public: CTest() : m_nTest(0) { cout << "Default constructor" << endl; } CTest(int a) : m_nTest(a) { cout << "Int constructor" << endl; } CTest(const CTest& obj) { m_nTest = obj.m_nTest; cout << "Copy constructor" << endl; } CTest& operator=(int rhs) { m_nTest = rhs; cout << "Assignment" << endl; return *this; } protected: int m_nTest; }; int _tmain(int argc, _TCHAR* argv[]) { CTest b = 5; return 0; } #包括 使用名称空间std; 类别测试 { 公众: CTest():m_nTest(0) { cout

构造函数或赋值运算符 < >你能帮助我,在C++标准中定义了哪一个在这个例子中被称为构造函数或赋值操作符:< /p> #include <iostream> using namespace std; class CTest { public: CTest() : m_nTest(0) { cout << "Default constructor" << endl; } CTest(int a) : m_nTest(a) { cout << "Int constructor" << endl; } CTest(const CTest& obj) { m_nTest = obj.m_nTest; cout << "Copy constructor" << endl; } CTest& operator=(int rhs) { m_nTest = rhs; cout << "Assignment" << endl; return *this; } protected: int m_nTest; }; int _tmain(int argc, _TCHAR* argv[]) { CTest b = 5; return 0; } #包括 使用名称空间std; 类别测试 { 公众: CTest():m_nTest(0) { cout,c++,copy-constructor,assignment-operator,C++,Copy Constructor,Assignment Operator,在本例中,默认构造函数总是使用int。这称为隐式转换,在语义上等同于以下代码: CTest b(5); 赋值运算符从不在初始化时调用。请考虑以下情况: CTest b = CTest(5); 这里,我们调用构造函数(取int)显式地,然后将结果分配给b。但再次强调,从未调用任何赋值运算符。严格来说,这两种情况都会在创建CTest类型的对象后调用复制构造函数。但事实上,该标准积极鼓励编译器优化此处的复制构造函数调用(§12.8/15)在实践中,现代C++编译器不会在这里发出一个拷贝调用。 这里

在本例中,默认构造函数总是使用
int
。这称为隐式转换,在语义上等同于以下代码:

CTest b(5);

赋值运算符从不在初始化时调用。请考虑以下情况:

CTest b = CTest(5);

这里,我们调用构造函数(取
int
)显式地,然后将结果分配给
b
。但再次强调,从未调用任何赋值运算符。严格来说,这两种情况都会在创建
CTest
类型的对象后调用复制构造函数。但事实上,该标准积极鼓励编译器优化此处的复制构造函数调用(§12.8/15)在实践中,现代C++编译器不会在这里发出一个拷贝调用。

这里所发生的情况取决于编译器。它可以使用int构造函数创建一个临时对象,然后从那个临时复制构造B。但是,它很可能避开复制构造函数调用。在这两种情况下,赋值操作符B都不会。e使用。

CTest b=5;
CTest b(CTest(5))完全等价;
涉及两个构造函数:一个接受
int
(从整数5隐式转换)的构造函数和复制构造函数。这里不涉及赋值运算符

编译器可能会优化掉不必要的副本,因此结果就像您键入了
CTest b(5)
。因此,在运行时,无论是看到打印的“copy constructor”(带有
-fno elide constructors
选项的GCC)还是没有打印的(默认情况下为GCC),都将是程序的有效输出

但是,从概念上讲,编译器需要检查是否存在可访问且合适的复制构造函数。如果a)复制构造函数是私有的/受保护的(不可访问的),或者b)复制构造函数通过非常量引用获取参数(不能接受来自
CTest(5)的临时变量),则表单
CTest b=5;
将无法编译
-不过,VC++可能会接受它作为非标准编译器扩展)


士气在于:通过查看代码,没有简单的方法来判断复制构造函数在程序中被调用的位置和次数。复制通常可以省略,因此您永远不应该依赖复制构造函数的副作用。如果它完成了它应该做的事,那么编译器是否消除了一些不必要的复制构造函数调用。

在“CTest b(5)”和“CTest b=5”之间有什么区别吗第一个语法是一般C++语法,用于创建一个类的实例并向构造函数提供参数。第二个语法只是构造函数只需要一个参数时使用的一个备选词。它存在,以便C代码在没有修改的情况下编译。@ JoeFies为什么你给出答案?作为评论?你能证明你所说的吗?在“测试b(5)”和“测试b=5”之间有什么区别吗取决于编译器吗?@ JUE,是的,我们正在说。第一个将不使用复制构造函数,第二个可能。@ JUIL -因为C++标准说它可以——恐怕你的理论是错误的。拷贝构造函数(这就是CTEST B=3意味着什么)需要一个CTest类型的对象,但您给它一个int,因此如果编译器希望使用另一个构造函数构造一个临时对象,那么它可以使用另一个构造函数,而一些较旧的编译器也会这样做。好吧,Konrad给出的答案是正确的。在这里构造临时对象然后调用复制构造函数的编译器不符合standard.@Axel:为了进一步说明,Konrad引用了该标准鼓励编译器进行优化。“鼓励”与“命令”不同.1,但我会尽量避免“默认构造函数接受int”一句中的“默认”。我认为只说“int构造函数”或“接受int的构造函数”会更清楚。默认值有特定的含义(无参数)在标准中,如果构造函数和赋值运算符方法是不同的代码,则调用.Assignment运算符。@BJovke No-决不在初始化内部。