读<<effective C++>>的疑惑总结

代码编译环境:

操作系统: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可以正常调用赋值运算符,编译、链接、加载、运行都没有报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值