代码编译环境:
操作系统:Red Hat 5.6 i386
编译器: GCC 4.1.2
条款05:了解c++默默编写并调用哪些函数
如果某个base classes将copy assignment操作符声明为private,编译器将拒绝为其派生类生成一个copy assignment??
#include <iostream>
namespace contestjia{
class noncopyable{
public:
noncopyable(){}
~noncopyable(){}
private:
noncopyable(const noncopyable &);
noncopyable& operator=(const noncopyable&);
};
}
class Home : public contestjia::noncopyable{
public:
Home(){}
};
int main()
{
Home a;
Home b;
a = b;
}
疑惑:如果派生类没有生成合成版本的赋值运算符,那应该不会隐式调用基类的赋值运算符,就不会出现编译出错,提示访问了基类的私有成员。
条款06:若不想使用编译器自动生成的函数,就该明确拒绝。
将copy constructor或copy assignment声明为private,可以阻止类对象的copy和赋值,然而member函数或friend函数还是可以调用这些private,但会引发链接错误。
#include <iostream>
class Home{
public:
Home(){}
void assignment(const Home &hs){
*this = hs;
}
private:
Home& operator=(const Home &hs){
if(this != &hs){
return *this;
}
}
};
int main()
{
Home a;
Home b;
a.assignment(b);
}
疑惑:成员函数assigment可以正常调用赋值运算符,编译、链接、加载、运行都没有报错。