毎日少しのC ++改善テクニックを学ぶ第05条:どの関数がC ++でサイレントに記述および呼び出されるかを理解する

//条款05:了解C++默默编写并调用了哪些函数

#include<iostream>
using namespace std;

class A
{
    
    
	int number;
public:
	A(int n):number(n)						//构造函数
	{
    
    
		
	}
	A(const A& rhs)	:number(rhs.number)		//拷贝构造函数
	{
    
    
	
	}
	A& operator = (const A& rhs)			//拷贝赋值函数
	{
    
    
		this->number = rhs.number;
	}

	int GetNumber(void)
	{
    
    
		return number;
	}
	~A()									//析构函数
	{
    
    
		
	}
};





class B
{
    
    
	//如果你自己没声明,编译器会为你声明一个拷贝构造函数(浅),一个拷贝赋值函数,一个无参构造函数,一个非虚析构函数
	//切都是公开内联的
};



int main()
{
    
    
	//A a1;//报错,因为你自己声明了一个有参构造函数,编译器不会为你声明无参构造函数了
	A a1(5);
	
	A a2(a1);   //自己写的拷贝构造,不写编译会为你声明
	A a3 = a1;   //自己写的赋值构造 ,不写编译会为你声明

	cout << "a1: " << a1.GetNumber() << endl;
	cout << "a2: " << a2.GetNumber() << endl;
	cout << "a3: " << a3.GetNumber() << endl;  //运行的结果一致
	
	B b1;							//声明一个对象,通过默认构造函数
	B b2 = b1;						//拷贝赋值
	B b3(b1);						//拷贝构造
}




class C
{
    
    
	int& m_number;
	const char m_c;
public:
	C(int number, char c) :m_number(number), m_c(c)
	{
    
    

	}
};


int main()
{
    
    
	C c1(10,'a');
	C c2(20,'b');
	//c2 = c1;   //报错,因为编译器不为这种情况生出拷贝赋值函数。
	
}

/*
如果你打算对一个内含引用成员和const成员的对象进行赋值操作,C++编译器拒绝为你定义该操作,所以必须自己定义一个拷贝赋值函数。
*/

おすすめ

転載: blog.csdn.net/weixin_50188452/article/details/111178922