C++学习笔记

从单片机的纯C转到C++还真是一段很长的学习路,记录一点比较生僻和比较重要的知识点,只是加深点印象罢了,也能知道自己哪些地方不足,读书百遍其义自见嘛....

1.一个类的所有数据成员都是公有的,则它不需要提供构造函数(这样的类,不知道有什么存在的意义...)

2.explicit只能被应用在构造函数上,防止隐式转换是很有必要的

3.即使是一个const对象,当这个对象的数据成员被声明为mutable时,这个mutalble数据成员也可以被改变

4.友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号

5.异常:异常可以穿越多层函数直接被较底层的函数截住而避免了层层上报,异常可以方便地携带任意多得信息

6.在VS中检查内存泄露的方法有很多,下面是一种:
debug模式下
在需要检查内存的地方定义
#ifdef _DEBUG
  CMemoryState oldMemState, newMemState, diffMemState;
  oldMemState.Checkpoint();
#endif

#ifdef _DEBUG
  newMemState.Checkpoint();
  if( diffMemState.Difference( oldMemState, newMemState ) )
  {
    TRACE( "Memory leaked! " );
  }
#endif

利用TRACE监测到内存泄露后,便可以使用另一个成员函数 CMemoryState::DumpStatistics 来查看内存统计,它将帮助定位内存泄漏。
CMemoryState::Difference 函数查看两个内存状态对象,并检测起始状态和结束状态之间未从堆释放的任何对象。在您拍内存快照并用 CMemoryState::Difference 比较它们之后,可以调用 CMemoryState::DumpStatistics 获取有关未释放的对象的信息。


7.在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。  
    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。  
    堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。  
    自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。  
    全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。  
    常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改

8.Visual Studio嵌入python
视图-》属性管理器-》打开Microsoft.Cpp.Win32.user-》VC++目录-》添加包含目录、库目录
无法打开python27_d.lib
搜索并下载一个,发现还有问题
最后选择release,不选择debug,搞定

9.
text段:Segment type: Pure code
idata段: Segment type: Externs 这里集中所有外部函数地址,代码中会先跳到该地 址后再执行
rdata段:字上看就是资源数据段,程序用到什么资源数据都在这里,资源包括你自己封包的,也包括开发工具自动封包的。
data段:这个段存放程序的全局数据、全局常量等。

10.如果基础类别和衍生类别都定义了「相同名称之成员函数」,那么透过对象指
针调用成员函数时,到底调用到哪一个函数,必须视该指针的原始型别而定,
而不是视指针实际所指之对象的型别而定

11.如果你期望衍生类别重新定义一个成员函数,那么你应该在基础类别中把此函数设为virtual,其子类的virtual字样可以省略。

12.由于static 成员函数不需要借助任何对象,就可以被调用执行,所以编译器不会为它暗加一个this 指针。也因为如此,static 成员函数无法处理类别之中的
non-static 成员变量static 成员函数「没有this 参数」的这种性质,正是我们的MFC 应用程序在准备callback 函数时所需要的。( callback 函数必须是"static",才能去除隐藏的'this' 指针)

13.出现在宏定义之中的##,用来告诉编译器,把两个字符串系在一起,在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏 变量通过替换后在其左右各加上一个双引号。

14.怎样才能建立在整个类中都恒定的常量呢?别指望 const 数据成员了(也别用define),应该用类中的枚举常量来实现。例如 
    class A 
    {… 
        enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量 
        int array1[SIZE1];  
int array2[SIZE2]; 
    }; 

15.B::B(int x,int y)
 :A(x) //在初始化表里调用A的构造函数
{}
类的const常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式初始化



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值