Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++ - Fatal编程技术网

C++ 当函数按值返回时是否执行复制构造函数?

C++ 当函数按值返回时是否执行复制构造函数?,c++,C++,在这里,我尝试使用对象数组,希望了解它们是如何构造和销毁的。我重载了返回类型的赋值运算符为“按值调用”,因此必须使用复制构造函数复制该值。我有自己的复制构造函数,但它不会执行复制构造函数,但对象是析构函数为什么 #include<iostream> using namespace std; class my { int i; public: my(){ cout<<"Constructor\n"; } my(in

在这里,我尝试使用对象数组,希望了解它们是如何构造和销毁的。我重载了返回类型的赋值运算符为“按值调用”,因此必须使用复制构造函数复制该值。我有自己的复制构造函数,但它不会执行复制构造函数,但对象是析构函数为什么

#include<iostream>
using namespace std;
class my
{
int i;
public:
    my(){
        cout<<"Constructor\n";
    }
    my(int a):i(a){
        cout<<"Parameterized Constructor\n";
    }
    my(my& m)
    {
        cout<<"copy constructor...........\n";
    }
    void display()
    {
        cout<<i<<endl;
    }
    ~my()
    {cout<<"Destructor\n";
    }
    my operator=(const my& m)
    {
        i=m.i;
        cout<<"Overloading Assignment Operator\n";
    }

};
main()
{
my *array=new my[2];//calls constructor 2times

for(int i=0;i<2;i++)
{
    array[i]=my(i+10);//overloading assignment operator
    cout<<"END\n\n";
}
for(int i=0;i<2;i++)
{
    array[i].display();
}
delete [] array;    
}

允许编译器避免为返回值创建临时对象,即使它们有副作用。

允许编译器避免为返回值创建临时对象,即使它们有副作用。

my(my&m)
不是复制构造函数。请回顾C++教程中给出副本构造函数示例的章节,并查看是否可以区分它们如何声明以及如何不复制声明的构造函数。此外,即使在函数返回值上有一个有效的复制构造函数,也允许编译器(或有时需要)来逐个拷贝,这取决于C++版本。这不是一个简单的主题。赋值运算符没有返回运算符,因此它是未定义的行为。不要忽略编译器警告。它们是防止逻辑错误的第一道防线。如果代码未生成警告,请查看编译器文档,了解如何提高编译器警告级别。提高警告级别,然后解决警告。一旦警告得到处理,您可能会看到也可能看不到预期的结果。正如Sam上面所说,它变得复杂了。@SamVarshavchik您能详细说明为什么
my(my&m)
不能是复制构造函数吗?@SamVarshavchik如果您暗示参数必须是
const
,。
my(my&m)
不是复制构造函数。请回顾C++教程中给出副本构造函数示例的章节,并查看是否可以区分它们如何声明以及如何不复制声明的构造函数。此外,即使在函数返回值上有一个有效的复制构造函数,也允许编译器(或有时需要)来逐个拷贝,这取决于C++版本。这不是一个简单的主题。赋值运算符没有返回运算符,因此它是未定义的行为。不要忽略编译器警告。它们是防止逻辑错误的第一道防线。如果代码未生成警告,请查看编译器文档,了解如何提高编译器警告级别。提高警告级别,然后解决警告。一旦警告得到处理,您可能会看到也可能看不到预期的结果。正如Sam上面所说,它变得复杂了。@SamVarshavchik您能详细说明为什么
my(my&m)
不能是复制构造函数吗?@SamVarshavchik如果您暗示参数必须是
const
Constructor
Constructor
//for 
Parameterized Constructor
Overloading Assignment Operator
Destructor
Destructor
END

Parameterized Constructor
Overloading Assignment Operator
Destructor

calling of destructor without constructing.
Destructor
END

10
11
Destructor
Destructor