废话少说, 直接上菜:
- #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;
- }