您的位置:首页 > 其它

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

2014-11-08 12:04 344 查看
       废话少说, 直接上菜:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: