C/C++
Pory
这个作者很懒,什么都没留下…
展开
-
二维数组的引用总结
今天在论坛上有朋友提问:声明函数如下void function(int** pInt),意图是想参数传递一个二维数组。于是就定义了一个二维数组,比如 int[1][1],然后调用函数。结果如何?当然是失败了,编译器提示:cannot convert parameter 1 from 'int [1][1]' to 'int **',参数类型不匹配。上述过程我自己也试了,当然不匹配,类型完全不一样嘛转载 2013-11-28 16:43:58 · 11427 阅读 · 0 评论 -
effective c++ 09 不要在构造函数和析构函数中调用virtual函数
原则 不要在构造函数和析构函数中调用virtual函数很直接,如果该类作为基类,在构造函数就调用类virtual函数,那么派生类在构造时首先会调用基类的构造函数,基类调用virtual函数此时都没有构造出来,而且即使virtual本来就有定义,也会造成用户不能理解的行为错误,因此不要在构造函数和析构函数中调用virtual函数...原创 2018-05-05 18:22:23 · 116 阅读 · 0 评论 -
effective c++ 10 令operator=返回一个reference to * this
原则 对于赋值操作符(=,+=)这些最好要遵循这个协议,最终返回一个左值的引用int x,y,z;x=y=z=15如上赋值连锁形式,实际上是x=(y=(z=15))所以如果要保留这种连续赋值,需要赋值完成后返回左值的一个引用,如下Object & operator=(const Object & obj){...赋值操作return *this;}...原创 2018-05-05 18:30:47 · 139 阅读 · 0 评论 -
effective c++ 14 在资源管理类中谨慎小心copy行为
原则:自己创建资源管理类时需要谨慎考虑copy行为,保持如下几个原则:1、禁止复制,将coping操作定义为private;2、采用引用计数法,类似shared_ptr,当引用计数变为0时,删除指针所指的对象,特别说明的时,对于shared_ptr指针有特殊的功能是可以制定删除器,来制定计数变为0时进行的操作,该删除器为第二参数,可有可无,如如下代码(unlock)class Lock{publ...原创 2018-05-13 11:05:52 · 229 阅读 · 0 评论 -
effective c++ 16 成对使用new,delete时要采取相同的操作
原则:使用数组形式new出来的对象,必须使用delete[]形式销毁,需要告知delete有多个对象需要析构,否则只有delete只会销毁首个,带来未知错误,同理如果时非数组形式new出来的,则不可用delete的形式销毁,否则会销毁其他位置的对象,带来不可预知的风险。...原创 2018-05-13 11:50:32 · 136 阅读 · 0 评论 -
effective c++17 以独立的语句讲newed对象置于智能指针中
原则:以独立语句将newed对象置于智能指针中,如果不这样做,一旦异常抛出,有可能造成内存泄漏而不易察觉。如下代码process(std::shared_ptr<Widge>(new Widge()),priority());编译器执行顺序有可能是:1、new Widge();2、priority();3、调用shared_ptr构造函数最终调用process,在此过程中,如果2 pr...原创 2018-05-13 13:44:23 · 126 阅读 · 0 评论 -
effective c++ 12 复制对象时不要忘了每一个成员
原则1、当增加或删减了类的成员时,一定记得同步修改复制构造函数和复制操作符函数,同时其他构造函数和任何非标准的operator=函数;原则2、当实现派生类当复制构造函数和operator=函数时,一定记得调用基类当构造函数和operator=函数class Customer {public:...private:std::string name;}class PriorityCust...原创 2018-05-06 22:32:02 · 125 阅读 · 0 评论 -
effective c++20 尽量以传引用代替传参,pass-by-reference-to-const 代替pass-by-value
原则:尽量以pass-by-reference-to-const 替换pass-by-value,前者通常情况效率更好,并且可以避免切割问题;但该原则并不适用stl的迭代器,函数对象以及内置类型,对于这些一般传值效率更高,对于自己定义的类型通常选用传引用较为高效。传引用较传值的好处主要有如下:1、传引用可以避免所有的构造和析构函数,极大的提高效率,传值会创建临时对象,调用构造,析构函数;2、可以避...原创 2018-05-13 15:32:38 · 227 阅读 · 0 评论 -
effective c++21 必须返回对象时,不要妄想返回reference
原则:绝不要返回一个point*或者reference指向一个local stack对象,或者返回reference指向一个heap-allocated对象,或者返回point*或reference指向一个stack local对象,而该对象又有可能同时使用,这些情况都是不允许的;尽管reference很高效,但在确实需要返回对象时就返回对象本身。...原创 2018-05-13 15:56:38 · 153 阅读 · 0 评论 -
effective c++22 将成员变量设计为private
原则:切记将成员变量设计为private,这可以赋予调用方数据的一致性,可细微划分访问控制,约束条件等,而且对于class本身提供了做够的弹性可修改,具有很高的封装性;另外,protected并不比public的封装性好,public会破坏自身的封装性,一旦public成员修改可能引起很多调用方的代码修改。但protected成员并没有好多少,因为protected影响的是所有继承类,一旦父类pr...原创 2018-05-13 16:07:41 · 197 阅读 · 0 评论 -
effective c++26 尽量延后变量定义出现的时间
原则:尽量延后变量定义出现的时间,最好直到可以初始化变量值时才定义,以避免不必要的构造函数,可提高程序的效率和清晰度;对于循环中使用的情况,如下两种情况A 方法:Weight w;for (int i=0; i<count; i++) {...w=i;..}B 方法:for(int i=0; i<count; i++) {...Weight w(i);...}除...原创 2018-05-13 16:59:46 · 179 阅读 · 0 评论 -
effective c++ 28 避免返回handles(引用,指针,迭代器)指向对象内部成分
原则:避免返回handles指向对象内部,该条款可增加封装性,帮助const成员函数的行为像个const,并将发生“虚吊号码牌”的可能性降到最低。如下即产生空悬class Rectangle {public:const Point& upperLeft() const {return pData->ulhc;}}const Rectangle boundingBox(co...原创 2018-05-24 23:17:48 · 349 阅读 · 0 评论 -
effective c++07 为多态基类声明virtual析构函数
原则,只要类需要被用作基类,即类中有virtual函数,就将基类析构函数设为virtual,如果类不是基类或者不具备多态性时就不用声明virtual析构函数!如果派生类中有独有的成员时,如果基类的析构函数函数不是virtual,在多态析构时,只会把基类的部分给析构掉,而不会析构派生类的成员,造成资源泄露但不意味着所有但类但析构函数都virtual才安全,事实如果类不作为基类,那么将析构声明为vir...原创 2018-05-05 18:00:27 · 111 阅读 · 0 评论 -
effective c++ 13 使用对象管理资源
原则 为防止资源泄露,多使用对象管理资源,他们在构造函数中得到资源在析构函数中释放资源,依赖析构函数,特别对于工厂方法等获得等对象指针如下:Object * createInstance(){...return * obj}对于这种为加工等裸指针,很容易造成资源泄漏,一种对象管理资源等方式是用智能指针来包装对象,如shared_ptr,auto_ptrshared_ptr可以复制,通过计数方...原创 2018-05-09 22:33:17 · 135 阅读 · 0 评论 -
C语言写文件生成文件名为系统时间的方法
很多时候对于一些log文件需要记录生成时间原创 2014-06-27 11:10:42 · 5823 阅读 · 1 评论 -
scanf与gets的区别,有待补充
以下内容转载自:scanf 和 gets 读取字符串深入了解scanf()/getchar()和gets()等函数scanf与gets函数读取字符串的区别今天看到一段话,大致是说gets比scanf()快,有点吃惊,搜了一下,scanf()和gets的区别大致有着几条:1.scanf() 会忽略行开头的所有空格,并以空格、换行符结束输入; 使用get转载 2014-05-26 13:53:53 · 1051 阅读 · 0 评论 -
Unicode下的CString与char *转换
在VS2005及以上的环境中,所见工程的默认字符集形式是Unicode,而VC6.0中,字符集形式为多字节字符集(MBCS: Multi-Byte Character Set),这样导致了许多字符转换的方法在Unicode的环境中不允许使用,强制类型转换的结果也会变得非常奇怪。如LPCTSTR与Char *的转换,在ANSI(VC6.0环境下默认编码)下,LPCTSTR == const转载 2014-07-31 20:59:13 · 688 阅读 · 0 评论 -
在MFC中类内部建立线程处理函数以便调用类的成员函数和变量
在用MFC做开发时,有时遇到些工作线程zhong原创 2014-08-17 19:33:37 · 4650 阅读 · 2 评论 -
VS 2010下 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏,终极解决办法
VS2010在经历一些更新后,建立Win32 Console Project时会出“error LNK1123” 错误,解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改为“否”即可,但是没新建一个项目都要这样设置一次。在建立VS2010 Win32 Project项目时,按照上面解决方案依然发生了“error LNK1123”错误,经过上网查资料,解决方案为:原创 2014-08-17 19:19:48 · 606 阅读 · 0 评论 -
.c和.cpp文件的区别
今天在封装库时,分别用了两种后缀的源文件封装。结果发现两者编译后不一样,甚至影响了接口的使用,就简单的总结下,不完整后续在添加。1.gcc认为.c的为C程序,.cpp的为C++程序;2.g++认为.c的为C++程序,.cpp的为C++程序;3.VC++的编译器cl认为.c的为C程序,.cpp的为C++程序;4.在编译源文件时,C编译器和C++编译器都会对符号(函数或变量)名作某些修原创 2015-03-18 13:08:02 · 1978 阅读 · 0 评论 -
结构体内存大小总结
#include typedef union { long i; int k[5]; char c;} DATE;struct data0 { int cat; DATE cow; double dog;} too;struct data1{ char a; double c; int b; };struct data2原创 2015-09-02 10:03:40 · 980 阅读 · 0 评论 -
C中内存分布,以及优化
首先看如下代码:#include struct mybitfields{ unsigned short a : 4; unsigned short b : 5; unsigned short c : 7;} test; void main(void){ int i; test.a = 2; test.b = 16; test.原创 2015-09-08 21:04:27 · 784 阅读 · 0 评论 -
关于C++中父类指针引用对象在内存中的分布
通过程序,这是我自己的理解,如果不对,麻烦帮忙指出来程序1#include using namespace std;class ClassA{public: virtual ~ ClassA(){}; virtual void FunctionA(){}; int a; int b;};class ClassB: public ClassA{publi原创 2015-09-05 22:18:13 · 569 阅读 · 0 评论 -
C++中,虚函数,引用指针,拷贝复制等知识点总结
1、父类指针,引用子类对象是,指针调用的成员,如果是非虚函数,则调用的是父类的成员函数(即使在子类中有同名函数),普通成员函数;如果是虚函数,则调用子类中函数,在虚函数表中被子类覆盖了;父类指针只能调用父类中存在的成员,如果调用只在子类中存在的成员会失败(尽管指向的对象是子类对象);2、虚函数在默认实参时,参数值是在编译时确定的。如果通过父类指针调用虚函数,虚函数参数为父类版本,调用的函数实体原创 2015-09-06 17:13:48 · 1121 阅读 · 0 评论 -
TCP 连接状态图
tcp状态:LISTEN:侦听来自远方的TCP端口的连接请求SYN-SENT:再发送连接请求后等待匹配的连接请求SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认ESTABLISHED:代表一个打开的连接FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认FIN-WAIT-2:从远程TCP等待连接转载 2015-09-08 14:53:23 · 674 阅读 · 0 评论 -
bazel cc_library 链接已经编好的动态库
bazel cc_library 链接已经编好的动态库,必须指定版本号,比如 srcs = ["deps/thrift-0.9.2/lib/libthrift-0.9.2.so",],必须这么写,不能直接srcs = ["deps/thrift-0.9.2/lib/libthrift.so",],即使libthrift-0.9.2.so和libthrift.so一模一样,md5都一样也不行,...原创 2019-08-09 11:52:44 · 3751 阅读 · 0 评论