• C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅰ部分


    =================================版权声明=================================

    版权声明:本文为博主原创文章 未经许可不得转载 

    请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我

    未经作者授权勿用于学术性引用。

    未经作者授权勿用于商业出版、商业印刷、商业引用以及其他商业用途。                   

    本文不定期修正完善,为保证内容正确,建议移步原文处阅读。                                                               <--------总有一天我要自己做一个模板干掉这只土豆

    本文链接:http://www.cnblogs.com/wlsandwho/p/4700397.html

    耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html

    =======================================================================

    其实之前并没有学习C++/CLI的想法,但是最近用SQL Server的时候,感收到了来自大宇宙的深深恶意,哦不,是MS的。

    CLI集成功能,对于某些情况下还是有用的,然而VC++并不太受待见。(SQL Server已不赞成使用扩展程序集。Dog my cats.)

    这样一来,由于崇高的C++信仰,我只能折中的选用C++/CLI并在其中调用标准C++的DLL——如此一来只要学一部分就行了,

    看起来进可攻退可守的样子。

    从“MASM/内联汇编”到“C/C++”再到“C++/CLI”,基本上没什么大问题。

    =======================================================================

    一边看一遍写 看不完就不写了。

    =======================================================================

     这本书开篇很有意思,“现在没有‘Hello World’应用程序”都不好意说这是一本讲编程的书。”

    =======================================================================

     第一章 Hello C++
    与 Hello World 的差别:

      使用的是using namespace System;没加添加 iostream和using namespace std;

      输出用的是Console::WriteLine()不是cout<<。

    =======================================================================

    第二章 面向对象编程基础

    与C++类的差别:

      class之前多了个修饰词

        ref  引用类型  指向对象内存位置的指针/句柄  CLR堆  慢

        value  值类型  就是对象本身          栈    快

    (第二章没有解释 ^ 符号,可能是个包袱。)

    =======================================================================

     第三章 变量和操作符

    与C++的差别

      基本数据类型

        C++    类型字节数大小平台相关

        C++/cLI          由.net平台决定

      类型转换

        C++    (double)600/3

        C++/CLI  double(600)/3//这个不算吧

              支持C风格、C++风格和自己的safe_cast<>

      有“句柄”//也能用指针

        C++   int* pN=new int[2]; 指针  内存地址  不变

        C++/CLI int^ nN=gcnew int[2]; 句柄  变量地址  更新//我怀疑这个实际上是在.net环境中虚拟的地址

       字符串类

        C++   string  C++类库  #include <string>

        C++/CLI String  .net类   using namespace System;  初始化后不可变,修改操作实际上返回的是新的字符串。

             StringBuilder  .net类  using namespace System::Text;  对于要经常修改的应该用这个

    =======================================================================

    第四章 使用函数

      Math::Round() 小数按位数四舍五入

      Console::ReadLine() 从键盘读取输入

      Convert::ToDouble() 字符串转double

      Random  随机数?

    =======================================================================

    第五章 判断和循环语句

      没有提到goto,看起来是作者在C++/CLI中不提倡用的样子,不过我很好奇有什么方法能优雅的跳出多层循环内部?

    =======================================================================

    第六章 类和对象进阶

      创建对象提倡使用^//声明句柄

      C++    构造函数

      C++/CLI  构造器

      #using <mscorlib.dll>  导入Microsoft intermediate language(MSIL)文件mscorlib.dll  使用文件定义的托管数据和构造

      推荐使用成员初始化列表

      静态构造器  对类进行一次性初始化  在使用这个类的任何东西之前会调用

            使用Static修饰  无参数

            声明  static MyClass1(); 

            实现  static MyClass1(){...}

      

      类级常量//在类的所有实例中都不变的值

        C++    static const

        C++/CLI  literal  要有初值  

      实例常量//创建实例后不能修改

        C++/CLI  initonly  由构造器设置

      nullptr  表示空句柄

    =======================================================================

    第七章 控制对象生存期

      垃圾回收器  gc//怪不得有gcnew

        托管堆

        代//无视吧

        强制垃圾回收 System::GC::Collect()

      析构器//析构

        delete对象时发生//gcnew和delete

      终结器

        前缀  !

        垃圾回收器在回收对象的内存之前发生

        使用了非托管资源就需要终结器//非托管代码中的 非托管类的指针 文件句柄 窗口句柄 图形设备上下文等

        不要定义空白内容的终结器

        终结器的执行顺序不能保证

        程序终止期间仍旧存活的对象不会调用终结器 可能不会正确清理自己

          后台线程使用的对象

          终结器内创建的对象

        可在析构器中调用终结器

      清理对象、回收内存  独立发生

      字符串和数组只能用gcnew,不能用栈语义创建

      拷贝构造函数

        C++    要么自己创建要么编译器提供  虽然编译器提供的默认拷贝构造函数是浅拷贝

        C++/CLI  只能自己创建  

        %  跟踪引用  C++中用拷贝构造函数和&

        *  解引用    C++中用途差不多

    =======================================================================

    第八章 继承

      System::Decimal  

        精确表示浮点值,不会发生舍入情况。

        效率不如float和double

      基类只能用成员初始化列表进行初始化

       只支持公共继承,可以不加public关键字

       构造函数照常声明,实现时函数头要有成员初始化列表(来初始化基类)。

      抽象类

        类名后加abstract修饰

      重写成员函数

        不需要重写的  不处理

        重写基类函数

          virtual int GetNum() override  重写覆盖基类函数

          virtual int GetNum() new    重写隐藏添加

          抽象(纯虚函数)

            virtual int GetNum()=0;

            virtual int GetNum() abstract;

        一定是我的C++理论版本太古老了,重写还能改变返回类型?VC6不能,现在2015不习惯,2010没尝试过。但这肯定不是个好的设计习惯。

      protected:

        只应创建受保护的成员函数,数据成员应该是私有的。

      密封类

        不可作为基类使用——它没有派生类

        ref class MyClass1 sealed{};

      既抽象又密封

        如,只包含静态成员

        ref class MyClass1 abstract sealed{};

        抽象  阻止实例化

        密封  阻止添加功能

      接口

        interface class IXxx

        {

         void Func(); 

        }

        ref class CMyClass1:IXxx

        {

          virtual void Func1();

        }

      类:

        C++    多继承

        C++/CLI  单继承  可实现多个接口

    =======================================================================

    第Ⅰ部分完结

      感觉没啥

    =======================================================================

  • 相关阅读:
    jQuery加载
    2.第一个flask web程序
    [转]前端懒加载以及预加载
    [转]当你在浏览器中输入 google.com 并且按下回车之后发生了什么?
    [转]如何让在FLASH不浮动在层之上
    逻辑回归基础梳理
    线性回归基础梳理
    [傻瓜式一步到位] 阿里云服务器Centos上部署一个Flask项目
    Java学习之"Hello World"
    JDK安装及Java环境变量配置
  • 原文地址:https://www.cnblogs.com/wlsandwho/p/4700397.html
Copyright © 2020-2023  润新知