Somethings About 《c++编程思想》

原创 2016年05月30日 13:35:19

以下为博主呕心沥血的总结,看的时候要珍惜一点,答应我!B_0039.gif


1.函数参数进栈顺序:从右到左

2.字符串化预处理特征:在表达式前加上‘#’表示将仍和一个表达式转化成一个字符串。

3.解析一个变量的类型:从中间向外扩展,先右再左,大多数的声明以左-右左完成(具体结合运算符的优先级来判断)

     eg: 

     1. void*( * ( *pfun )( int ) )[ 10 ]    

     解析:pfun是一个函数指针,指向一个参数是int返回值是一个只想有10个void*元素的数组的指针

     2.float(* ( *fp2 ) ( int ,int,float ) )( int )

      解析:fp2是一个函数指针,指向参数列表是int,int,int返回值是一个函数指针的函数。

     (返回值里的函数指针指向一个返回值是float 参数列表是int)

4.创建函数指针数组,支持“表格驱动码”概念:可以根据状态变量选择函数而不用条件判断。

    eg:

    #define     DF (N ) void N (){\
         cout << "函数"#N"被调用..." << endl ; }
    DF(a); DF( b); DF(c); DF (d ); DF( e); DF(f); DF (g );
    void(*func_table [])() = { a, b , c, d , e, f, g };
    int main ()
    {
         while (1)
         {
                cout << "press a key from 'a' to 'g',or 'q'" << endl;
                char c;
                cin. get( c);
                if (c == 'q' )
                     break;
                if (c >= 'a' && c <= 'g')
                     (*func_table [c - 'a' ])();
                else
                     continue;
         }
         return 0;
    }

5.makefile行为(p101)

6.任何情况下都不允许同时使用两个具有同名函数的C库

7.C++:对象必须要有唯一的标识,对象即变量

8.将函数捆绑在数据结构内部的语言是基于对象而不是面向对象

9.全局作用域解析直接使用::前面不加任何限定

10.嵌套结构的友元:先声明这个结构->再声明它是一个友元结构->最后定义

11.句柄类:头文件放置公共的接口和一个单指针。

                  所有成员函数的定义一同出现在实现文件中,只要接口部分不变头文件就不要改动                    

                  具体实现的结构被隐藏在实现的文件中。

12.联合不能作为基类使用

13.C++的const默认为是内部连接属性,所以在定义时必须给他一个值,除非使用extern来说明

14.关键字static :不管类被实例化多少次,所有对象都只拥有同一份static实例

15.enum hack:将匿名枚举嵌套在类中,我们就可以将枚举里的数据当成static const

16.const对象:保证该对象的数据成员在其生命期内不被改变

17.const函数:必须保证将const置于参数列表的后面,不修改数据成员的函数都应该把它们声明为const

     构造和析构都不是const函数,因为他们总数对数据成员做了一定的修改

18.关键字mutable :指定一个特定的数据成员可以再const对象里面被改变! 

19.关键字volatile:告诉编译器:“请不要随便假设,并且消除冗余代码。”

                              在编辑器认识的范围外该数据可以被改变!

20.C++的弱类型(模板):一个类型想要调用的成员函数对于一个特定的对象可用

21.return 一个匿名对象和一个非匿名对象是不同的(返回值优化)

     eg: 

         return 类名(数据);

         // 这里编译器直接把这个对象创建在外部返回值的内存单元


          类名 对象名;

          return 对象名(数据);

          //编译器首先创建对象,然后将对象拷贝构造给外部返回值的内存单元里,最后再将tmp析构 

22.嵌套的友元类:先声明类名,再声明友元,最后定义

23.operator->*:可以直接调用成员函数(p515)

     流程:operator->*(函数指针)->返回一个匿名对象

               调用operator()

               获得间接引用(真实的)指向成员的指针

     *仅用于参数和返回值是int的指针

24.不能重载的运算符:.    .*(成员指针的间接引用)   **   ::    ?:  

25.输入输出流最好作为友元原因:运算符>>和<<的左侧操作数是ostream的对象和istream的对象,

                                                    如果按照正常的思维将其定义出来调用时只能这样:对象名<<cout;

wKioL1b_i66gfm1YAAApq93PCro902.png

26.自动类型转换:当编译器发现一个表达式或者函数使用了一个不合适的类型,他进行类型转换

   A.构造函数转换:当编译器看到类A的方法调用了类B的对象。

      而A的构造函数传参是B类型的,它就会先调用这个构造函数啦

      如果你不想这样的方式发生的话就在构造函数前加上explicit关键字

   B.运算符转换:没有指定返回类型的operator 可以将当前类型转换成为希望的类型

     eg:

            A::operator B() const {return B(_data);}//_data是A类的数据成员

   *可以做到从用户定义类型向内置类型的转化

27.全局重载运算符可体现反身性,成员版本必须保证左侧操作说处于正确的形式!

28.自动类型转换的缺陷

    a.复杂的类型转换

wKiom1b_i42TQIrMAAArPMz2KsA713.png

    *编译器此时认为这是一个不明指示

    b.扇出:在一个类中提供了多种类型的自动转换函数的重载

    c.隐藏的行为。

29.栈分配运算内置于处理器的指令集里

30.如果delete一个void 指针则不会调用析构函数(这将是一个程序的错误)

    *如果程序出现内存丢失的现象记住检查每一个被delete的指针的类型!

31.容器中含有void*类型的指针,所以他们不能自己管理指针必须由我们负责清除这些对象

    *不要讲指向栈上内存的指针和指向堆上内存的指针存放在同一个容器里!

32.尽量将指向数组的指针用const修饰

33.new-handler函数

34.组合:在新类中创建已存在的类的对象

35.构造函数的初始化表达式表:D::D(int data):Bar(data), m(data+1){}

36.组合和继承的选择

     组合:希望新类具有已存在的类的方法

     考虑:你是否需要向上类型转换

38.渐增式开发:允许在已存在的代码中引入新代码,并且新代码不会导致已存在的代码发生错误

39.向上类型转换:使用基类指针类型调用子类方法

40.可扩展性:只和基类通信接口

41.派生类如果继承的是一个抽象类那么它必须实现基类所有的纯虚函数(抽象方法)

42.RTTI:运行时确认

43.对象切片:虚函数使用了传值调用

44.不把析构函数设置为虚函数是一个隐匿的错误,可能会引入存储器泄漏    


本文出自 “Zimomo” 博客,请务必保留此出处http://zimomo.blog.51cto.com/10799874/1759571

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

相关文章推荐

write somethings about my feelings

乔布斯曾经被他一手创建的苹果公司所抛弃,这个时期是他人生最黯淡的时间段,但也是这个时期他找到了他一生最爱的女人,他拥有一个非常完美的家庭以及4个子女,他改变了世界却失去了健康,不知他在世时反思过没有,...

C++编程思想——运行时类型识别

运行时类型识别 C++中有两种方法可以识别当前运行的类型信息: 1、dynamic_cast,记得我们之前多态提及向上类型转换,试图用基类来调用子类的方法,当然了需要虚函数的辅助,其实类型的信息正是虚...

C++编程思想--函数重载和默认参数

第7章 函数重载与默认参数 一、何谓函数重载 函数重载中,可以通过调用同一个函数名字达到不同的功能,但是传入的值类型或许不同。于是在C++中设置其为函数重载。 1、那么编译器是如何区分不同的参数类型的...

《C++编程思想》(Thinking in C++)部分精华提取

1、声明与定义: 首先,必须知道“声明”和“定义”之间的区别,因为这两个术语在全书中会被确切地使用。“声明”向计算机介绍名字,它说,“这个名字是什么意思”。而“定义”为这个名字分配 存储空间。无论...

C++编程思想杂记(15章 多态性和虚函数)

封装使接口从具体实现中分离开来,而虚函数则根据类型来处理解耦。继承可以使多个类型使用相同的代码,而虚函数可以表现一个类型与其另一个相似类型的区别。 函数体和函数调用相联系称为捆绑,即binding...

c++编程思想--const常量

const 常量 一、值替代 1、预处理器:预处理器可以不受限制使用宏并用它来代替值。但是预处理器制作文本替换,没有类型检查。 2、Define定义只是在与处理期间存在,并不占用存储空间,它的工...

C++编程思想第二章练习答案

1.修改Hello.cpp,使它能打印你的名字和年龄(或你的鞋码,爱犬的年龄等,只要你喜欢)。编译并运行修改后的程序 修改前的Hello.cpp #include using namespace...

c++编程思想中的数据记录器中的一些问题

今天编写C++编程思想中的输入输出流的简单数据记录器的时候发现源代码中的一些问题。 也许是自己学艺不精,自作聪明,先写给自己看吧。先贴代码   首先,我把datalogger.h和datalogger...

C++编程思想读后感(七):Function Overloading and Default Arguments

1、C++引入函数重载(Overload)的原因有二:其一、方便程序员使用相同的函数名称表达相近的功能实现(仅仅参数不同);其二,构造函数名称已经确定等于类名,而构造函数又极有可能需要多个,函数重载势...
  • goalcn
  • goalcn
  • 2011年06月14日 23:14
  • 462

关于C++编程思想151页遇到的内存分配问题

书上例子如下:1、//: C06:Nojump.cpp// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Somethings About 《c++编程思想》
举报原因:
原因补充:

(最多只允许输入30个字)