废话少说, 直接上菜:
- #include <iostream>
- using namespace std;
-  
- class A
- {
- public:
- 	int x;
- 	A(A&)
- 	{
- 		cout << "copy constructor" << endl;
- 	}
-  
- 	void fun() const
- 	{
- 		x = 1; // error, 这个const限定该成员函数不能改变成员变量
- 	}
- };
-  
- int main()
- {
- 	return 0;
- }
      继续:
- #include <iostream>
- using namespace std;
-  
- class A
- {
- public:
- 	int x;
- 	
- 	A()
- 	{
- 	
- 	}
-  
- 	A(A&)
- 	{
- 		cout << "copy constructor" << endl;
- 	}
-  
- 	void fun(A a) // 有对象拷贝
- 	{
- 	}
- };
-  
- int main()
- {
- 	A a, b;
- 	a.fun(b); // 会有拷贝构造函数被调用
-  
- 	return 0;
- }
      继续:
- #include <iostream>
- using namespace std;
-  
- class A
- {
- public:
- 	int x;
- 	
- 	A()
- 	{
- 	
- 	}
-  
- 	A(A&)
- 	{
- 		cout << "copy constructor" << endl;
- 	}
-  
- 	void fun(A& a) // 引用
- 	{
- 	}
- };
-  
- int main()
- {
- 	A a, b;
- 	a.fun(b); // 没有拷贝构造函数被调用
-  
- 	return 0;
- }
      继续看:
- #include <iostream>
- using namespace std;
-  
- class A
- {
- public:
- 	int x;
- 	
- 	A()
- 	{
- 	
- 	}
-  
- 	A(A&)
- 	{
- 		cout << "copy constructor" << endl;
- 	}
-  
- 	void fun(const A& a) 
- 	{
- 		a.x = 100; // error,  const引用, 所以a.x的值不能改变
- 	}
- };
-  
- int main()
- {
- 	A a, b;
- 	a.fun(b);
-  
- 	return 0;
- }
      go on:
- #include <iostream>
- using namespace std;
-  
- class A
- {
- public:
- 	int x;
- 	
- 	A()
- 	{
- 	
- 	}
-  
- 	A(A&)
- 	{
- 		cout << "copy constructor" << endl;
- 	}
-  
- 	A fun() 
- 	{
- 		A aa;
- 		return aa; 
- 	}
- };
-  
- int main()
- {
- 	A a;
- 	a.fun(); // 会有拷贝构造函数被调用
-  
- 	return 0;
- }
go on:
- #include <iostream>
- using namespace std;
-  
- class A
- {
- public:
- 	int x;
- 	
- 	A()
- 	{
- 	
- 	}
-  
- 	A(A&)
- 	{
- 		cout << "copy constructor" << endl;
- 	}
-  
- 	A& fun() 
- 	{
- 		A aa;
- 		return aa; // danger, 返回局部对象的引用非常危险, 此时仅仅作示意用 
- 	}
- };
-  
- int main()
- {
- 	A a;
- 	a.fun(); // 没有拷贝构造函数被调用
-  
- 	return 0;
- }
go on:
- #include <iostream>
- using namespace std;
-  
- class A
- {
- public:
- 	int x;
- 	
- 	A()
- 	{
- 	
- 	}
-  
- 	A(A&)
- 	{
- 		cout << "copy constructor" << endl;
- 	}
-  
- 	A& fun(A& a) 
- 	{
- 		return a;
- 	}
- };
-  
- int main()
- {
- 	A a, b;
- 	a.fun(b).x = 1; // ok
-  
- 	return 0;
- }
go on:
- #include <iostream>
- using namespace std;
-  
- class A
- {
- public:
- 	int x;
- 	
- 	A()
- 	{
- 	
- 	}
-  
- 	A(A&)
- 	{
- 		cout << "copy constructor" << endl;
- 	}
-  
- 	const A& fun(A& a) 
- 	{
- 		return a;
- 	}
- };
-  
- int main()
- {
- 	A a, b;
- 	a.fun(b).x = 1; // error,  常引用
-  
- 	return 0;
- }
     go on:
- #include <iostream>
- using namespace std;
-  
- class A
- {
- public:
- 	int x;
- 	
- 	A()
- 	{
- 	
- 	}
-  
- 	A(A&)
- 	{
- 		cout << "copy constructor" << endl;
- 	}
-  
- 	A& fun(const A& a) 
- 	{
- 		return a;
- 	}
- };
-  
- int main()
- {
- 	A a, b;
- 	a.fun(b).x = 1; // error
-  
- 	return 0;
- }
       最后的菜:
- #include <iostream>
- using namespace std;
-  
- class A
- {
- public:
- 	int x;
- 	
- 	A()
- 	{
- 	
- 	}
-  
- 	A(A&)
- 	{
- 		cout << "copy constructor" << endl;
- 	}
-  
- 	const A& fun(const A& a) const
- 	{
- 		return *this;
- 	}
- };
-  
- // ok
- int main()
- {
- 	A a, b;
- 	a.fun(b);
-  
- 	return 0;
- }

 
                

















