Effect C++之旅 之 导读

    写这些东西实际上也是一个笔记的作用,希望有所提高。文章不会专注什么C++基本的东西和语法,因为这些东西的资料很多,所以我只写一些自己以前还不知道的东西,以取得一点点的进步。

    在此,我也只是以知识点的结构来描述,每个知识点之间没什么关系。

   

POINT 1, explicit

 

    1. 作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。

 

    2. 举例:

        class  A

        {

            A(int x = 0, bool b = true);    //这里没有用explict修饰,你会看到下面的隐式类型转换

            A(double dblValue);

         }

         void doSomething(A& aObject);

 

         A aObj;

         doSomething(aObj);    //没问题

         doSomething(2);        //这个也没有问题,原因是进行了隐式类型转换

         //过程如下:编译器知道传的值是int而函数需要的是A类型,但它也同时知道调用A的构造函数将int转换成

         //一个合适的A,所以才有上面成功的调用.换句话说,编译器处理这个调用时的情形类似下面这样:  
          const  A  temp(2);      //   从2产生一个临时A对象   
          doSomething(temp);    //   调用函数 

 

          A aObj1 = 1.23;          //没问题,被隐式转换了,等价于:A aObj1 = tmp(1.23);

 

 

     3.建议:能用explict就用,除非有理由允许编译器进行隐式类型转换。

 

POINT 2, copy construct and copy assignment( = )

 

     每个类都会有默认的构造函数和copy构造函数,如果自己不指定,那么系统就会用默认的。对于系统默认的copy 构造函数来讲,它是pass by value的,完全就是一个hard copy。

     所以,如果你的类里面有指针的话,那么一定要重新copy构造函数,不然两个对象用同一个指针,很容易出问题。

     而且很容易引起死循环,比如:???

  

 

     1. 作用:copy construct是为了解决诸如下面的语句:

         A aObj;

         A a1Obj(aObj);

 

        copy assignment就是operator "="  赋值操作符,是为了解决如下的语句

        A a2Obj;

        a2Obj = aObj;    //copy assignment

 

        但有一点,单独的"="也有可能调用copy construct函数,比如:

        A a3Obj = a2Obj;    //copy construct

 

        看起来很难区分吧,其实分辨起来也简单。如果一个新对象被定义,就如上面的a3Obj,肯定会调用copy construct,不可能调用copy assignment。如果没有新对象被定义,比如a2Obj = aObj,当然不会调用copy construct,所以就是copy assignment。

 

      2. 建议:对象传递,不要用pass by value,代价太大,用&

    

 待续...

   

阅读更多
文章标签: c++ 编译器 class c
个人分类: C/C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭