const A& fun(const A& a) const {} 的理解

来源:互联网 发布:ibatis源码下载 编辑:程序博客网 时间:2024/06/02 05:58

       废话少说, 直接上菜:

#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; // okreturn 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; // errorreturn 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;}};// okint main(){A a, b;a.fun(b);return 0;}



1 1