C++知识点
RocWay007
这个作者很懒,什么都没留下…
展开
-
C++ 11的enable_shared_from_this
C++ 11的提供了一个模板类std::enable_shared_from_this。目的为安全获取当前对象的shared_ptr提供方便。原因一般在对象的函数中,是不可以返回一个指向this指针的shared_ptr。因为如果当前对象已经析构,当shared_ptr再次析构时,因为其管理的指针已经不再合法,所以会导致Undefined行为。如果实在有这种需求,就应该使用std::enable_shared_from_this提供的shared_from_this方法获取。使用class S原创 2022-05-06 23:55:28 · 400 阅读 · 0 评论 -
【解决】g++: error trying to exec ‘cc1plus’: execvp
项目场景:Linux编译安装gcc找不到cc1plus问题描述g++: error trying to exec ‘cc1plus’: execvp:原因分析:网上很多说gcc和g++版本不匹配,说重新安装的。拜托,不要再抄袭了。实际在linux系统中无法执行某个程序,要么是目标文件真不存在,要么存在,但是当前用户权限不足编译安装的gcc,由于要安装到/usr/local,所以需要高权限的用户。这时大家一般喜欢使用sudo make install。这里比较容易出现问题,sudo之后原创 2022-05-03 10:44:26 · 2236 阅读 · 0 评论 -
初始化与赋值是不同的操作
l 赋值仅发生在调用赋值运算符时,l 初始化涉及较广,包括声明变量、函数返回、参数传递、异常捕捉。 对于built-in类型,int、char、double、float等,赋值和初始化没有什么不同,都是向指定内存中复制数值。但是对于用户自定义的类型,则有更多的事情要做,特别是类对象,赋值操作在通常情况下是先将当前对象析构,然后再根据右值重新构造新的对象。原创 2008-05-19 21:44:00 · 607 阅读 · 0 评论 -
必须要使用成员初始化列表的情况
1. 成员是对象;2. 成员是Const;3. 成员是引用。原创 2008-05-19 13:12:00 · 511 阅读 · 0 评论 -
能用if- else/throw-exception进行错误/异常处理的地方就不要用assert。
首先我们要明确assert的作用,它是在Debug版中断言某种状态或值,或者说在那一时刻,软件应该是某种状态,变量的值也是预期的。因此,从这个意义上说,应该使用assert的地方如果再加入if-else的错误处理就是画蛇添足、违反逻辑了。或许有人会说:”assert只在Debug版本中有效,那Release版怎么办?”l 用if-else。既然Release版有错误处理的需要,那么只原创 2008-05-07 14:52:00 · 4061 阅读 · 0 评论 -
尽量用C++的新式cast,而不是C的旧式cast
1. C++的cast精准,而C的cast模糊类型转换是经常出问题的地方,需要小心运用,尽量避免模糊的语义。l C式的cast,形似type(…),与非cast形式的构造函数调用相同,不易区别。l C式的cast功能强大,甚至可以将const变量转换成非const的变量,而调用者却毫无察觉,非常危险。const int a = 123;int b = (i原创 2008-04-25 21:03:00 · 537 阅读 · 0 评论 -
常引用(const reference)
一般引用只能初始化为变量的引用,不能是字面常量或临时变量(如函数返回值)。但常引用可以。如: const int &a = 123; const int &b = RefFun();特别是如果函数的参数声明为const reference,也可以传入字面常量。template T add( const T &a, const T &b )原创 2008-04-23 21:57:00 · 902 阅读 · 0 评论 -
异常安全的函数(方法)
所谓异常安全的函数是指:即便是在这个函数的调用过程中出现异常,也不会影响到重要的数据或状态。【异常安全原则】:尽量把可能抛出异常的代码写在函数的最前面,让异常尽量早地抛出,在改变重要数据或状态之前抛出异常。 让我们来比较两段代码:void f1(){ importantData.Invalidate(); data = getNewDat原创 2008-04-29 17:44:00 · 661 阅读 · 0 评论 -
函数模板参数推导的两个经典应用
1. 推导数组参数。【可以分别推导出“元素类型”和“数组长度”】// 模板函数定义templateint bound, typename T>void f1( T (&ary)[bound] ){ T x; for(int i=0; ibound; i++ ) { x = ary[i]; }}原创 2008-04-23 17:31:00 · 1529 阅读 · 0 评论 -
几种计算时间的方法
1. 响应WM_TIMER消息。精度非常低,最小 计时精度仅为30ms。2. Sleep()函数,精度也是30ms。3. 利用COleDateTime类和COleDateTimeSpan类,结合WINDOWS的消息处理过程,精度秒级。4. GetTickCount()函数,获取从系统启动开始到现在花去的时间。精度度比WM_TIMER消息映射高,在较短的定时中其计时误差为15ms,在较原创 2008-04-07 17:30:00 · 4416 阅读 · 0 评论 -
J2ME程序开发新手入门要领
一、J2ME中需要的Java基础知识JAVA手机网[www.cnjm.net] 现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成了一些不必要的麻烦,下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明。JAVA手机网[www.cnjm.net] J2ME中使用到的Jav原创 2008-04-02 11:23:00 · 218 阅读 · 0 评论 -
虚基类的初始化
假设有如下的类:基类B,虚继承派生类D1, D2, 最终派生类F,多继承自D1, D2。 1. B的直接派生类,D1和D2,其初始化列表中要显式地调用B的构造函数;2. B的间接派生类,F,其初始化列表也要显示的调用B的构造函数。这是因为虚拟派生过程中,只有一个虚拟基类的子对象,不能因为多重派生,而对该子对象进行多次,甚至相互矛盾的初始化。因此,只能在最终派生类F中显示的初始化原创 2008-03-13 13:55:00 · 1160 阅读 · 0 评论