C/C++中需要注意的一些小东西

........

1、int *p =new int(5);给p指针对应的地址里面存放值为5。

      int *p =new int[5];动态申请一个长度为5的数组,里面的值不确定。

2、vector不是一个类,而是一个类模板。

3、在派生类中如果需要显示调用基类的构造函数进行初始化时,则表明基类存在带有参数的构造函数,如果基类是无参构造函数,那么不需要再派生类中显示的调用,系统默认调用基类的无参构造函数对继承来数据进行初始化。

派生类构造函数执行的顺序如下:

      1)基类的构造函数执行顺序按照他们继承时候的顺序进行调用。

      2)接下来对派生类新增的成员对象进行初始化,按照他们在类里面的声明先后顺序进行调用。

      3)最后再执行派生类自己构造函数里面的东东。

4、作用域符来区别多重继承时候基类的成员被重复继承的问题。

比如:

      class A 

      {

       public :

            int i;

            void func();

      };

      class B 

       {

        public :

             int i;

             void func();

        };

       class C : public A ,public B

       {};

       C c;

       c.A::i=1; 

       c.A::fun(); 

       或者通过在派生类中这样声明:

       class C : public A ,public B

       {

        using A ::i;

        using B::fun();

        }

5、虚基类主要是为了解决菱形继承图形时候的数据成员或者函数成员的多次继承,这种虚基类可以只在内存中保存一种形式。可以使用作用域符来分辨他们::,如上面所说的4那样,也可以使用虚基类。

class A 

{

public :

int a;

void fun ();

};

class B : virtual public A 

{};

class C : virtual public A 

{};

class D : public B ,public C 

{};

D d ;

d.a=1;//访问的虚基类A的数据成员

d.fun();//访问的虚基类的A的函数成员

6、基类指针可以转换成派生类指针通过显示转换,但是基类对象不能直接转换成派生类对象,除非派生类接受基类(或者它的引用类型)参数的构造函数。

A a;

B b =static_case<A>(a);    错误。

7、静态绑定和动态绑定也就是早绑定和晚绑定,对应着多态的两种实现方式。

8、对于运算符重载的前置++和后置++上面,存在一个有无int参数的区别,int在着没有任何实际的作用,只是为了区别前置++和后置++

eg:

      A  operator ++(int)   后置单目运算符进行重载

      A  operator ++()       前置单目运算符进行重载

9、虚函数也就是用在多态性上面的,加入派生类需要修改基类的一些函数行为,那么就把基类中的函数修改为虚函数,然后在派生类中进行重写。

     最需要强调的是:只要通过基类的指针或者引用去调用虚函数时,才可以发生动态绑定,通过基类的对象无法实现。原因:

基类的指针可以指向派生类的对象,基类的引用可以作为派生类对象的别名,但是基类的对象不能表示派生类的对象。

10、不能声明虚构造函数,但是可以声明虚析构函数,为了在基类指针指向派生类的某一些情况下面释放派生类中开辟的空间。

11、只要带有纯虚函数的类就是抽象类,派生类假如没有给出基类的全部纯虚函数的实现,那么派生类此时也是属于抽象类。抽象类不能实例化,也就是不能定义对象,但是可以 定义一个抽象了类的指针和引用。

12、浅拷贝&深拷贝:假如一个类中存在数据成员是指针类型的时候,就涉及到需要深拷贝,要不然会导致在对象调用赋值构造函数时,没有真正的赋值,只是简单的把元素首地址进行赋值,而且可以避免在对象赋值之后调用析构函数的时候,对同一段内存进行两次释放。因此需要手动写复制构造函数(对需要进行开辟的空间进行开辟,释放的空间进行释放)。

13、如果要编写一个不能被继承的类,因为一个类能不能定义对象,其实就是看构造函数,所以定义的类,假如构造函数放在私有数据中,那么相当于这个类没有意义,被继承也无法调用构造函数。但是定义这个类没问题,只是没有。

14、编译时多态:就是在进行语法检查确定就调用哪个函数,重载就是这个,此时只是进行了编译,将程序代码转换成了目标代码,没有和操作系统进行连接,不能运行。

       运行时多态:编译完后,与操作系统进行了连接,并且操作系统进行运行,在这一段时期进行的多态就是运行时多态,重写(覆盖)就是这样。

15、多态中的虚函数表:

       简单简述:每个类都有一张虚函数表,用这个类定义的对象存在一个指针都会指向这个虚函数表(即虚函数表指针),所以不管怎么转换这个对象,每次调用它的函数都是不变的。

16、peekmessage和getmessage的区别:

       异步和同步的区别,peekmessage都是从消息队列中取消息,不管有没有消息都会直接返回,但是getmessage假如消息队列中没有消息,那么就会一直等待,知道消息队列中有一个消息时就会返回。

发布了23 篇原创文章 · 获赞 4 · 访问量 9967

猜你喜欢

转载自blog.csdn.net/hxp1994/article/details/89824938
今日推荐