C++一些注意的地方

1:vector内存分配策略:以最小的代价连续存储,每当vector不得不分配新的存储空间时,以加倍当前容量的分配策略实现重新分配

2:类:
必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式:构造函数初始化列表。

3:explicit 抑制由构造函数定义的隐式转换,并且它只能用于类内部的构造函数声明上,在类的定义体外部所作的定义不在重复它。
   static 关键字在类内声明成员函数,在类外定义函数时也不需要再重复写出来。

4:调用复制构造函数的时刻:

       a:当定义一个新对象并用同一个类型的对象对它进行初始化,这时显式的使用复制构造函数

       b:当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式的使用复制构造函数

5:C++支持两种初始化形式:直接初始化和复制初始化。直接初始化将初始化式放在圆括号中,复制初始化用“=”符号。

当用于类对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造

函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象中。

 

复制构造函数的形参并不限制为const,但必须是一个引用。

class Foo{

            public:

            Foo();

            Foo(const foo & copy);

};

 6:和复制构造函数一样,如果类没有定义自己的赋值构造函数,则编译器会合成一个。

        Sales trans, accum;

         trans = accum;

         class Sales {

                    public:

                   Sales & operator= (const Sales & copy)

                    {

                                     ........;

                                    return *this;

                       }

       };

 

7:如果类需要析构函数,那么它也需要赋值操作符和复制构造函数,这就是“三法则”。

 

8:包含指针的类需要特别注意复制控制,原因是复制指针时只复制指针中的地址,而不会复制指针指向的对象。

9:保留字virtual的目的是启用动态绑定,它只在类内部的成员函数声明中出现,不能用在类定义体外部出现的函数定义上。

      触发动态绑定,必须满足两个条件:

      1:只有指定为虚函数(virtual)的成员函数才能进行动态绑定,成员函数默认为非成员函数,非成员函数不能进行动态绑定;

       2:必须通过基类类型的引用或指针进行函数调用。

 

        通过基类引用或指针调用基类中定义的函数时,我们并不知道执行函数的对象的确切类型,执行函数的对象可能是基类类型的,也可能是派生类型的;

        如果调用非虚函数,则不论实际对象是什么类型的,都执行基类类型所定义的函数。如果调用虚函数,则直到运行时才能确定调用哪个函数,运行的

       虚函数是引用所绑定的或指针所指向的对象所属类型定义的版本。

 

        只有通过引用或指针调用,虚函数才在运行时确定。

10:继承的简单形式:

       class Bulk : public Base{

 

       };

11:继承类只可以访问基类的pulbic和protected成员,就像访问自己的成员一样,private成员不能访问。

12:友元关系不能继承。构造函数和复制控制成员也不能继承,每个类定义自己的构造函数和复制控制成员。

         当使用派生类构造函数时,隐式的先调用基类的构造函数,再调用派生类的构造函数。

        如果派生类定义了自己的复制构造函数,该复制构造函数一般应显示的使用基类复制构造函数初始化对象的基类部分,如:

         class Base {....};

         class Derived: public Base[

                     public:

                     Derived(const Derived & d): Base(d){

                                  .......

                      }

         };

13:如果派生类重定义了重载成员,则工作派生类型只能访问派生类中重定义的那些成员。

 

14:含有(或继承)一个或多个纯虚函数的类是抽象基类。除了作为抽象基类的派生类的对象的组成部分,不能创建抽象类型的对象。

            class  Disc{

                        public:

                                   double net_price(std:size_t) const = 0            //纯虚函数

               };

你可能感兴趣的:(C++,c,vector,存储,Class,编译器)