临时变量与复制构造函数

class B
{
public:
	B(){
		cout << "构造函数" << endl;
	}
	B(const B &b)
	{
		cout << "复制构造函数" << endl;
	}

	~B()
	{
		cout << "析构函数" << endl;
	}
};

B play(B b)
{
	return b;
}

main函数输入如下代码:

{
		B b1;
		play(b1);
}

输出:

main函数输入如下代码:

{
		B b1;
		B b2=play(b1);
	}

输出:

为什么两个图是一样的?我猜是因为B b2=play(b1); 这一行代码,通过复制构造函数产生了临时返回值变量,然后b2调用了移动复制构造函数?

做一下实验,加入赋值操作符和移动构造函数:

<pre name="code" class="cpp">class B
{
public:
	B(){
		cout << "构造函数" << endl;
	}
	B(const B &b)
	{
		cout << "复制构造函数" << endl;
	}
	B(B &&b)
	{
		cout << "移动构造函数" << endl;
	}
	B& operator=(const B &b)
	{
		cout << "赋值操作符" << endl;
		if (this == &b)
			return *this;
		return *this;
	}

	~B()
	{
		cout << "析构函数" << endl;
	}
};

B play(B b)
{
	return b;
}

void main()
{
	{
		B b1;
		B b2 = play(b1);
	}

	cout << "-------------------------" << endl;
	{
		B b1;
		B b2;
		b2 = play(b1);
	}
}

输出:


去掉移动构造函数:

class B
{
public:
    B(){
        cout << "构造函数" << endl;
    }
    B(const B &b)
    {
        cout << "复制构造函数" << endl;
    }
    B& operator=(const B &b)
    {
        cout << "赋值操作符" << endl;
        if (this == &b)
            return *this;
        return *this;
    }  

    ~B()
    {
        cout << "析构函数" << endl;
    }
};  

B play(B b)
{
    return b;
}  

void main()
{
    {
        B b1;
        B b2;
        b2 = play(b1);
    }
} 

输出:

时间: 2024-11-08 01:15:04

临时变量与复制构造函数的相关文章

临时变量与复制构造函数(二)

为了直观观察,以下代码中复制构造函数会把成员变量num+1 class B { int num; public: B():num(0){ cout << "默认构造函数" << " num= "<< num <<endl; } B(int n) :num(n){ cout << "带参构造函数" << " num= " << num <&

复制构造函数的运用

构造函数和析构函数 一.构造函数: 1.普通构造函数:在对象被创建时利用特定的值构造对象,将对象初始化到一个特定的状态. 特性:构造函数的函数名和类名相同:没有返回值:在对象被创建时被自动调用:如果有构造函数,建立对象时必须给出初始值. 2.复制构造函数(特殊的构造函数) 复制构造函数和赋值运算符的行为差不多,都是将一个对象的值复制给另一个对象:但是复制构造函数是使用一个已经存在的对象去初始化一个同类的新对象而赋值运算符是把对象的值复制给一个已经存在的变量. 复制构造函数在以下三种情况下会被调用

C++类的复制构造函数和赋值运算符

前言: C++面向对象的编程过程中,凡是在类中运用到动态内存分配的时候总是会写一个显示的复制构造函数和赋值重载运算符,本文将结合C++ Primer Plus一书的内容分析下原因: 一.在C++编程中如果没有编写下列成员函数,系统会自动的提供: (1)构造函数 (2)析构函数 (3)地址运算符 (4)赋值构造函数 (5)赋值运算符 其中(1)-(3)在编程中不会产生什么影响,但是(4)(5)会造成较大的影响 二.赋值构造函数 1.函数原型  Class_name(const Class_name

C++ 复制构造函数

C++类的设计中,如果某些函数没有显式定义,C++会自动生成,复制构造函数便是其中之一,其他的还有默认构造函数.赋值操作符.默认析构函数.地址操作符.一个类的复制构造函数的原型一般为: Class_name (const Class_name &); 一.何时调用复制构造函数 在新建一个对象并将其初始化为同类对象的时候,常常会调用复制构造函数,如: Class_name A(B); Class_name A = B ; Class_name A = Class_name(B); Class_na

复制构造函数(拷贝构造函数)

也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生.对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什么用,其实复制构造函数能解决一些我们常常会忽略的问题. 为了说明复制构造函数作用,我先说说我们在编程时会遇到的一些问题.对于C++中的函数,我们应该很熟悉了,因为平常经常使用:对于类的对象,我们也很熟悉,因为我们也经常写各种各样的类,使用各种各样的对象:对于指针的操作,我们也不陌生吧?嗯,如果你还不

【C++】复制构造函数

参考资料:黄邦勇帅(里面对于临时变量的说法我不是很理解,感觉里面的解释有问题) 用到复制构造函数的情况: 1.函数值传递 2.返回对象 3.用一个对象初始化另一个对象 重点注意下面两种情况: ① 只调用复制构造函数,不会生成临时变量 A a = b; ② 会产生临时变量,会调用复制构造函数和赋值函数 A a; a = b; #include<iostream> using namespace std; class hyong { public: int a, b, c; hyong() { a

复制构造函数和赋值操作符的注意点.

记得在复制构造函数和赋值操作符的参数类型上加上const.正确的复制构造函数应该是X::X(const X&)这种,而不是X::X(X&)这种,这里有两个原因. 第一:绑定一个非const引用到一个临时对象是非法的.使用X::X(X&)作为复制构造函数不会允许复制任何特殊表达式的结果.为什么呢.?因为引用的初始化规则规定了不能将临时变量作为引用的初始化值. 而常量引用除外. 此外:防止修改引用的值(这个大家都知道). 同样的道理: X::operator=(const X&

C++的简单总结(复制构造函数,深拷贝,前拷贝,默认属性)

类的三大属性: private,public,protected 1,对于类的成员变量或者函数,缺省即为私有 #include <iostream> using namespace std; class A { int y; //私有成员 int x; //私有成员 public: A(int xx, int yy) {x = xx; y = yy;} void setx(int m) {x = m;} void sety(int n) {y = n;} }; int main() { A a

引用与析构,通过引用减少临时变量

通过引用可以大大减少创建临时变量的次数,从而提高程序运行的效率. 本文探讨创建通过引用减少创建临时变量的次数,与临时变量的生命周期. 测试一:不使用引用并且返回的临时变量不用引用保存. #include <cstdio> #include <iostream> using namespace std; class Point{ private: static int count; int x; public: Point() { printf("constructor c