了解编译器的行为

来源:互联网 发布:女装淘宝店铺特别名字 编辑:程序博客网 时间:2024/04/19 14:39

了解编译器的行为

          当我们创建一个类时,编译器会为我们做什么!很多时候,由于不了解编译器的行为,我们的程序中总会有很多隐晦的问题,而这些问题往往不会有任何的编译或者连接期错误。

          对于一个类,编译器可能会为我们定义的函数有:默认构造函数,拷贝构造函数,赋值操作符和析构函数。

          因此,如果我们建立一个类:

                        class Empty{};

           就等同于我们建立了一个类

                      class Empty

                           {

                                Public:

                                     Empty(){}

                                    ~Empty(){}

                                    Empty(const Empty&);

                                    Empty& operator=(const Empty&);

                          };

          但是,如果我们自己建立了一个其中任何一个的话,那么编译器就不会再为我们创建了。

          在有些程序中,我们可能不想实现拷贝和赋值操作,这个时候我们又不能直接不定义,因为不定义的话,那么编译器就会自动为我们创建一个。解决的方案就是将拷贝构造函数和赋值操作符定义在private内,这样一旦客户程序员调用拷贝或者赋值,编译器就会提示一个错误。但这样仍不够严密,因为成员函数和声明为friend的函数仍然可以调用他们,我们可以进一步解决这个问题,那就是只使用函数的声明而不加以定义,这个时候如果成员函数或者friend函数想调用的话,链接器就会发生一个错误。

          当然,如果我们可以将链接期错误提至编译器更好,因为编译器错误要远比链接期错误容易解决。因此,我们可以定义这么一个类

                   class Noncopy

                   {

                            protected:

                                     Noncopy(){} 

                                    ~Noncopy(){}

                            private:

                                    Noncopy(const Noncopy&);

                                    Noncopy& operator=(const Noncopy&);

                   };

          这样,我们通过继承这个类,每一次子类想要建立拷贝或者赋值操作符时,编译器就会拒绝这类请求,并在编译期提出错误。

          但遗憾的是,这种解决方案导致的多重继承问题,可能会为我们的程序带来更大的麻烦。

          总而言之,为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现。

 

原创粉丝点击