C++一句话知识点荟萃[累计更新]

(1)建议用指针传递那些允许被调用函数修改的参数,而用对常量的引用来传递那些不需修改的大型参数;引用变量必须在声明时初始化!如: int a=3, &b=a; //b是引用变量,并且它是a的别名

(2)用相同的参数列表和不同的返回类型建立重载函数是一种语法错误,C++编译器只用参数列表区分同名函数!

(3)要通知C++编译器一个或多个函数已经在已经在C中编译好了,可以像下面这样写出其函数原型:

单个函数: extern "C" 函数原型

多个函数: extern "C" { 函数原型 }

(4)友元关系是不对称的:即如果类A是类B的友元类,不能就因此认为类B是类A的友元;类友元关系是不传递的:即如果类A是类B的友元类,类B是类C的友元类,不能就因此认为类A是类C的友元类

(5)复合是软件重用的一种形式,也就是把其他类的对象作为自己的成员!

(6)析构函数没有参数和返回值。一个类只能有一个析构函数,重载析构函数是不允许的!

(7)大部分编译器要求模版的声明和实现在一个文件里,这叫做模板的包含编译模式.通常在.h文件中声明类,而在.cpp文件里定义类。但对模板类来说这是不行的。因为编译器在实例化一个模板类时,不光要知道声明,还必须知道定义。所以最好把声明和定义都放在.h文件中。STL头文件就是这样做的。

(8)运算符重载是通过编写函数定义实现的,函数名是由关键字operator和其后要重载的运算符符号组成,例如函数名operator+重载了+运算符。

(9)用于类的运算符必须重载,但是赋值运算符=和取地址运算符&无需重载即可使用。C++赋值运算=默认行为是逐个拷贝类的数据成员,这种行为在拷贝指向动态分配内存的指针数据成员时是危险的,这种类通常要重载我们自己的赋值运算=。

(10)关于COM,所有的接口都是从IUnknown接口派生出来的,故所有的接口都包含QueryInterface,AddRef,Release这3个成员函数。实现一个接口时,就自动运行了IUnknown接口,原因在于每个函数表(接口)的前面几个函数都是在IUnknown中的。

(11)new为对象分配一块内存并返回一个指针,若分配失败,则返回NULL。但这并非全部,在完成分配之后,返回之前,new将调用类的构造函数,由于new运算符会返回空间分配是否成功的信息,所以构造函数不会返回任何值,由于这个缘故,C++程序员总是避免在构造函数中放置有可能失败的代码。因为构造函数无法通过返回值来知道失败,所以通常会提供另一个新的初始化函数来实施可能对失败很敏感的一些操作。

(12)纯虚拟函数的形式是在类说明中对函数赋予0,这意味着该函数的实现将只能出现在派生类中。纯虚拟函数并不在对象的函数表中创建入口,只要一个类还有一个纯虚拟成员函数,它便是一个抽象的基类,它便不能被实例化。

(13)一个抽象基类告诉派生类“你必须重写(override)我的纯虚拟函数!”。一个具备一般的虚拟函数的普通基类将告诉派生类“如果你真的关心它们,那么你可以重写(override)这些函数。”

( 14 )类(class),以世俗的观点来看,是对数据成员及操作该数据成员的成员函数的定义。类仅是一种定义,而不带有任何实现。类一旦被实例化就称为对象。

( 15 )如果你是一个对象,那么你的引用计数就要求你过一种独特的生活,即你始终不能安息,直到所有的熟人全部过世了为止。只有当你的引用计数为0时,才被允许释放存储器。

( 16 )引用计数基本规则:1对象的一个新的接口指针创建必须伴随一个通过该新指针对对象的AddRef调用。2一个接口指针的消除必须在其被清除之前伴随一个通过该指针的Release调用。

( 17 )对象的寿命是由其所有接口对AddRef和Release的所有调用总和起来所控制的。任何返回接口指针的函数必须通过该指针调用AddRef.无论何时要创建一个指针的新拷贝,必须通过该新拷贝调用AddRef.

( 18 )如果在自己的机器上有一网卡,就可以运行UUIDGEN.EXE的工具,它将基于时间,日期以及包含在网卡中的一个独特的数字来向我们提供一组256 GUID.该工具生成重复GUID的机会几乎同宇宙中两个随机的原子相撞而形成一个月亮的机会一样。也就是说,根本不用担心发生这种事。

( 20 )如果只要创建一个对象,用CoCreateInstance就行了,但是如果想一次创建多个对象,则需要调用CoGetClassObject获取该类别的一个类工厂,然后视情况需要反复调用IClassFactory::CreateInstance,最后在结束时调用Release

( 21 )REGCLS_SINGLEUSE:每当用户调用CoGetClassObject,将启动应用程序的另一个实例 REGCLS_MUTIPLEUSE:应用程序的一个实例可以为任意多个用户服务。

( 22 )CoRegisterClassObject并不是一个只能从EXE中调用的函数。如果某个DLL想在其DllGetClassObject或者DllGetClassObject所替代的实现外展示一个分类工厂,那么他应会调用这个函数。在此情况,标志总是REGCLS_MUTIPLEUSE

( 23 )DLL从不主动告诉任何人去卸载它,相反,COM将通过调用一个导出函数DllCanUnloadNow周期性地询问DLL“你现在卸载吗?”COM调用DllCanUnloadNow的是CoFreeUnusedLibraries

( 24 )继承的一个最主要的问题是同一对象上有两段不相关的代码片段,派生类必须知道基类的实现,这使派生类违反了它作为基类一个用户的状态。建立在继承基础上的系统一个关键问题是,他们必须带有所有的源代码才能工作。

( 25 )可以被聚集的聚合元组件必须:1)允许接受外部的控制未知物,即通过其分类工厂CreateInstance的pUnkOuter参数传入 2)聚合元并不通过拥有的外部控制未知物指针调用AddRef 3)聚合元自己的控制未知物可返回聚合元的所有接口指针

( 26 )CRT自定义了前端分配器,使用CRT库的程序,如果需要频繁分配释放(new/delete;malloc/free)内存,不妨将extern unsigned int _amblksiz;的值设得大些,这样会减少前端分配器向后端分配器(Win32堆)的次数,这会显著提高效率。

( 27 )相反,使用CRT库的程序,如果需要使用巨大的内存,而只需要一次分配一次释放内存,分配之前,不妨将extern unsigned int _amblksiz;的值设得小些,这样会减少malloc过程中产生的内存空间丢失,为系统节约了宝贵资源。

( 28 )Shut down and reboot the system:ExitWindowsEx(EWX_REBOOT, 0);

( 29 )当然如果你想让计算机重启,仅仅这样还不够,你需要在调用这个ExitWindowsEx(EWX_REBOOT, 0); 之前先OpenProcessToken, LookupPrivilegeValue, and AdjustTokenPrivileges来提升你的进程权限

( 30 )再教你一招:两个API函数更改显示器分辨率,他们是:EnumDisplaySettings, ChangeDisplaySettings

( 31 )解决弹出菜单TrackPopupMenu的一个弊病:弹出菜单往往一闪即消失,这时你不妨试试:PostMessage(hwnd, WM_NULL, 0, 0);你会发现这个症状消失了

( 32 )如何让Windows的消息框中出现自定义的图标?呵呵,看似很难,实际上这很简单,只要您使用MessageBoxIndirect而不是用MessageBox即可。

( 33 )如果需要在辅助线程中更新由主线程创建的界面,为了排队这些操作,我们在更新之前需要调用:AttachThreadInput(GetCurrentThreadId(),GetWindowThreadProcessId(hwnd, NULL), TRUE);

( 34 )CCmdTarget类BeginWaitCursor,EndWaitCursor,RestoreWaitCursor3个函数处理等待光标。若在BeginWaitCursor和EndWaitCursor之间弹出模式对话框,在关闭后调用RestoreWaitCursor重新设回沙漏。

( 35 )但如果弹出的是MessageBox()消息框,就不必调用RestoreWaitCursor(),光标会自动恢复为沙漏。

( 36 )在非CCmdTarget派生类中,可以用CWaitCursor类设置等待光标。该类构造和析构函数相当于CCmdTarget的BeginWaitCursor,EndWaitCursor,成员函数Restore相当于CCmdTarget::RestoreWaitCursor

( 37 )Windows以线程封装消息循环,封装消息循环的线程叫做用户界面线程,即UI线程。该线程可以创建并撤销窗口。

( 38 )根据需要,一个应用程序中也可以创建多个UI线程。CWinThread类是MFC用来封装线程的,包括UI线程和工作者线程。每个MFC程序至少使用一个CWinThread派生类。

( 39 )CWnd的SubclassDlgItem:将控件句柄与相应类对象关联。DlgDirList和DlgDirListComboBox:以文件列表或目录列表填充(组合框)列表框。CheckDlgButton和CheckRadioButton:设置复选框(单选按钮)状态。

( 40 )GetNextDlgTabItem():取得下一个WS_TABSTOP风格的控件。GetCurrentMessage():取得当前被处理的消息。PreTranslateMessage():可重载的虚函数。被UI线程的消息循环调用,可以过滤窗口收到的消息,过滤出的消息得以分发。

( 41 )SendMessage():向本窗口发送消息。不通过消息循环,直接调用窗口函数处理消息。窗口函数执行完毕,该函数才返回。PostMessage():向本窗口寄送消息。将消息放入消息队列,立即返回。

( 42 )Default():为消息的默认处理函数。对无需处理的消息或希望默认处理的消息,可以使用它。该函数一般要调用一个默认的窗口过程,对当前消息执行默认的系统级处理。

( 43 )RecalcLayout() :虚函数,当控制条位置变化或客户区尺寸变化时被调用,重新设置视图及控制条在客户区的位置。可根据需要重载它或主动调用它。

( 44 )GetDockState():将控制条状态信息存入一个CDockState对象。SetDockState():从一个CDockState对象中恢复控制条状态。SetMessageText():在状态栏的第一个面板区域显示一个信息串。

( 45 )ShowControlBar():显示或隐藏控制条。SaveBarState():将所有控制条的状态存入初始化文件或注册表。LoadBarState():从初始化文件或注册表中恢复所有控制条状态。

( 46 )OnInitMenuPopup处理WM_INITMENUPOPUP,设置弹出菜单的各项目的启用/禁止状态OnEnterIdle处理WM_ENTERIDLE,设置状态条的空闲时提示信息,OnMenuSelect处理WM_MENUSELECT,当某菜单项被选择时更新状态条提示。

( 47 )用VS2008中的VC++写的WIN32程序,在发布时需要注意side-by-side问题, 需要安装一个Visual C++ 2008 redistributable package发行包或者拷贝编译机器上的:C:/Program Files/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT目录下的所有文件包括manifest文件到目标机器最终EXE所在目录。否则,若你直接把release版的EXE拷贝到目标机器,运行后会出现错误消息框:“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正整个问题。”

 

by Loomman, QQ:28077188, MSN: Loomman@hotmail.com QQ裙:30515563 ☆程序天堂☆ 请尊重作者原创,转载注明来自裂帛一剑博客,谢谢合作。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值