C++
weixin_38911779
这个作者很懒,什么都没留下…
展开
-
在同一个程序中结合C++
在同一个程序中结合C++和C在同一个程序中结合C++以及c我们需要注意的4大主题:1.name mangling (名称重整)2.statics(静态对象初始化)3.动态内存分配4.数据结构的兼容性。对于名称重整我们知道在C++中由于重载的存在我们需要对函数的名称进行重整,但是c的函数我们就不需要重整。那么当我们在我们的C++程序中引入一个c的头文件,里面含有一些函数,原创 2017-09-20 11:04:56 · 312 阅读 · 0 评论 -
effective C++条款四十二解读
了解typename的双重意义1.template 与template 没有区别。typename 的另一种用法,我们以一个代码来解释:templatevoid print2nd(const C&container){ if(container.size()>2) { C::const_iterator iter(container.begin()); ++iter;原创 2017-08-29 09:51:20 · 204 阅读 · 0 评论 -
effective C++条款四十一解读
了解隐式接口和编译期多态面向对象的编程世界总是以显示接口以及运行期多态解决问题。class Widget {public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); void swap(Widget& other); }void doPro原创 2017-08-29 09:19:04 · 308 阅读 · 0 评论 -
more effective C++条款四解读
深刻考虑是否需要给类提供一个默认构造函数有一些类拥有一个默认构造函数是合理的需求,比如string比如容器 linked list vector 默认构造函数可以把他们初始化为空容器。但是有一些类我们最好还是不要提供默认构造函数。比如一个equipment类class equipment{private: int IDNumber;}对于这个equipment类,我们提供一个默认原创 2017-09-06 15:53:28 · 275 阅读 · 0 评论 -
more effective C++条款二解析
少用转型操作,如果非要使用转型操作请使用C++新式的转型操作转型操作首先并非是完全没有效率上损失的(多重继承派生类到子类的转换),所以首先我们需要尽量少用转型操作,如果我们非要使用转型操作也要使用新型的C++风格的转型操作static_cast const_cast dynamic_cast reinterpret_cast.(主要原因是C风格的转型操作并不区分各种类型的转型操作,同时转型原创 2017-09-06 15:15:16 · 232 阅读 · 0 评论 -
more effective C++条款一解析
仔细区别指针和引用指针和引用的最大区别在于:没有所谓的NULL reference存在,并且reference总是指向他当初获得的那个对象,不能改变。所以当我们考虑不指向任何对象或者指向的对象可能改变的时候需要使用指针。当我们指向的对象不会改变时使用引用(使用引用时不用测试器有效性)同时我们明白引用一般不单独使用,主要使用在函数参数以及返回值上。比如一个常用的运算符重载就使用引用ope原创 2017-09-06 14:59:16 · 343 阅读 · 0 评论 -
more effective C++条款十二解析
了解抛出一个异常的方方面面首先我们必须清楚,一个异常对象被抛出的时候一定是发生了对象的复制行为的,所以抛出异常可能是比较慢的操作。因为第一次抛出对象一定会发生复制行为,所以说抛出的一定是对象的静态类型(相对于动态类型来说的),但是在第二层处理函数抛出异常的时候,我们可以简单的使用throw;来避免对象的复制行为。相对于抛出异常一定发生对象的复制行为,利用catch接收异常的时候我们却需要用by原创 2017-09-13 20:01:45 · 191 阅读 · 0 评论 -
more effective C++条款十解析
在处理异常的时候 利用对象来管理资源来避免资源泄露我们的程序可能在某一条语句抛出异常,导致其之后的代码没有被执行。这时候我们利用对象来管理资源,避免泄露,你可能会说利用try catch的形式,但是形式使我们的程序的复用性降低,并且可读性降低。利用对象来管理资源,如果抛出异常来的话,当程序离开其作用域析构函数就会被调用。避免资源泄露。在构造函数内阻止资源泄露构造函数尚未完成,C++不原创 2017-09-13 18:58:55 · 296 阅读 · 0 评论 -
C++对象模型解析三
复制构造函数的操作像default constructor一样 如果一个class没有声明一个复制构造函数,就会有隐式的声明出现。跟之前一样,C++标准会把复制构造函数分为有用的以及无用的,只有有用的实例才会被合成到程序之中,决定一个copy constructor是否是trivial的标准在于class是展现出所谓的bitwise copy semantics。bitwise copy原创 2017-09-06 09:28:50 · 154 阅读 · 0 评论 -
C++对象模型解析二
编译器对于对象构造过程的干涉,以及对于程序形式和程序效率的冲击对于一个class X,如果没有任何user-declared constructor,那么会有一个默认的constructor被隐式的声明出来....一个被隐式声明出来的构造函数是一个trivial constructor(无用的constructor)。编译器会合成non-trivival constructor 的4中情况原创 2017-09-05 16:25:38 · 135 阅读 · 0 评论 -
C++对象模型中数据成员与继承
继承与数据成员的关系这里我们讨论继承与数据成员的关系主要涉及这几个方面:1.单一继承同时又不含virtual fucntions2.单一继承并含虚函数3.多重继承4.虚拟继承单一继承同时又不含virtual function的情况:1.这里注意主要这一张单一继承的关系无法表现出多态,也就是多不能通过基类的对象来同时处理基类以及派生类的对象。2.这里可能会造成代码膨胀原创 2017-08-27 17:47:19 · 190 阅读 · 0 评论 -
C++ 对象模型(数据成员相关一)
C++数据成员相关一以一个例子来讲解,下面四个类分别对他们求sizeof求出其所占内存空间的大小,我们获得的结果可能是1,4,,4,8,也可能是1,8,8,12class X {};class Y :public virtual X{};class Z :public virtual X{};class A :public Y, public Z{};我们来具体解释原创 2017-08-27 15:22:58 · 240 阅读 · 0 评论 -
C++对象模型解析一
关于对象原创 2017-09-04 17:05:38 · 162 阅读 · 0 评论 -
effective C++条款四十解读
明智而谨慎的使用多重继承使用多重继承的时候一定要注意,两个基类是否有相同的基类,这样需要使用虚继承,但是虚继承又不得不带来新的问题就是增加对象的大小,速度以及初始化复杂度成本。一般使用virtual class最好是不带任何数据。不过多重继承也有他的用途,比如我们可以多重继承来完成所谓的公有继承继承接口Private继承用于协助实现。原创 2017-08-26 18:47:17 · 196 阅读 · 0 评论 -
effective C++条款三十九解析
明智而谨慎的使用private继承首先必须强调的一点是private继承不是Is-a关系,而是根据某物实现,而根据某物实现的最佳方式是复合(稍后我们会说private继承的用途)。第一个使用private继承我们需要强调的一点是:编译器不会将一个private继承而来的对象转换成一个base类对象。我们首先来看一个例子:class Person{}class Student:pr原创 2017-08-26 17:55:37 · 209 阅读 · 0 评论 -
effective C++解读
通过复合塑模出has-a或根据某物实现复合主要表明的意思是has-a以及根据某物实现,在应用域类复合塑造出的关系式has-a比如Person类has-a name 并且has-a address,但是在实现域复合又表现出根据某物实现的意思。比如我们可以根据deque类实现出stack以及queue这就是根据某物实现出的道理。has-a或者根据某物实现千万不要写成了继承的关系。原创 2017-08-26 17:28:22 · 348 阅读 · 0 评论 -
effective C++条款四十三解读
学习处理模板化基类内的名称直接以一段代码来解释class companyA{public: void sendMsgA(); void sendMsgB(); ...};class companyB{public: void sendMsgA(); void sendMsgB();}class companyC{public: void sendMsgB()原创 2017-08-29 10:16:47 · 310 阅读 · 0 评论 -
effective C++条款四十五解读
运用成员函数模板接收所有参数类型这里我们主要以智能指针模板为例来讲解,原始指针之间存在这样派生类像基类的转换,也就是一种隐式转换关系:类似下面这种情况:class Base {}class Derived: public Base{}Base *pB=new Derived;我们也希望智能指针支持类似这样的操作,以使其支持运行期多态。那么可以通过成员函数模板来解决这个问题:原创 2017-08-29 14:16:03 · 354 阅读 · 0 评论 -
more effective C++在未来时态下发展程序
在未来时态下发展程序所谓的未来时态就是接受事物总会改变的事实,并准备应对之道。我们应该以C++本身来表现各种规范而不是简单的以注释和说明文档的形式:如果我们的类不想被继承那么我们就可以把构造函数以及复制构造函数声明为private(这样的函数不能够被构造),然后再类中声明我们自己的伪构造函数。如果一个class必须生成在heap内,在不被继承的情况下我们可能考虑把对象的析构函数声明为p原创 2017-09-20 10:33:49 · 290 阅读 · 0 评论 -
more effective C++设计模式 要求(或禁止)对象产生于heap中
要求(或)禁止对象产生于heap中有时候我们想让某种对象具有自杀的能力,所以我们必须要求对象存在堆中,以便我们调用delete this.有的时候堆空间非常宝贵,并且我们需要保证不发生内存泄露所以我们要对象全为栈对象,必须禁止对象产生于堆中。要求对象产生于堆中一种典型的手法是把析构函数声明为protected,然后给类一个伪构造函数destroy来调用delete this.下面我们来原创 2017-09-18 14:35:54 · 398 阅读 · 0 评论 -
more effective C++设计模式限制对象产生
限制对象的产生个数限制对象产生的个数是我们在程序设计中经常遇到的问题,有的时候我们的系统只有一台打印机,所以我们只能存在一个打印机对象。我们的文件描述符有限,所以我们也要限制文件描述符产生的数量。单例模式设计以一个打印机对象的设计为例子:class PrintJob;class Printer{public: friend Printer& thePrinter();pr原创 2017-09-17 14:47:54 · 176 阅读 · 0 评论 -
more effective 一些设计模式解析一
将构造函数和非成员函数虚化遇到这个主题的时候,我们必须明白构造函数并没有实际的是虚函数,只是表现出了虚函数的行为而已,就是根据输入中的真实东西(而不是表面上的一些东西)执行相应的行为。将构造函数虚化将构造函数虚化主要分为两个部分,就是虚构造函数以及虚复制构造函数。虚构造函数的主要用途在于从磁盘或网络构建对象的时候,我们来看下面的例子(用于处理新闻的类,其内容主要由文字以及图像构成,原创 2017-09-17 11:00:41 · 187 阅读 · 0 评论 -
more effective C++效率解析
与C++语言密切相关的效率问题了解临时对象的来源临时对象意味着对象的构造以及析构,我们必须了解临时对象的产生,以规避一些效率问题,临时对象主要的两个产生方式:1.隐式类型转换被施行以求函数调用成功。2 函数返回对象的时候。对于第一种情况:以下代码解释:size_t countChar(const string& str,char ch);char buffer[100原创 2017-09-16 15:11:37 · 221 阅读 · 0 评论 -
more effective C++ 效率解析
提升程序的效率作为c++程序员,要提升程序的效率,那么主要是从两个方面来考量:1.与程序语言无关的一些法则。2.与C++密切相关的一些效率法则。(不要产生和销毁过多的对象)。与程序语言无关的一些法则:1.牢记80-20法则,一个程序80%的资源用于20%的代码上,我们必须有针对性的改进这个20%的代码才能提升我们代码的效率。具体针对哪部分进行优化,并不是靠猜测的,而是使原创 2017-09-15 14:38:43 · 243 阅读 · 0 评论 -
more effective C++条款八解读
了解不同意义的new和delete这里所说的new是new operator,operator new 以及placement new。首先我们明确new操作符需要完成两个工作,一个是调用operator new分配一定的内存空间,调用对象的构造函数。如果我们我们打算自己给对象分配内存,那么我们定义自己的operator new,在调用new操作符,那么new操作符会调用我们的operat原创 2017-09-07 16:17:56 · 239 阅读 · 0 评论 -
more effective C++条款六解析
区分前置increment与后置increment区分前置与后置++,首先明确他们的操作符重载带来的写法上的不同:class UPInt{public: UPint& operator++() {*this+=1;return *this} const UPInt operator++(int) { UPInt oldValue=*this;++(*this);return old原创 2017-09-07 15:51:52 · 269 阅读 · 0 评论 -
more effective C++条款五解析
尽量不要提供类型转换函数类型转换函数主要包括单自变量的构造函数以及显示定义的operator type(),这两个函数都可以隐式的对象类型进行转换,但是隐式类型转换经常是我们不能控制的。对于显示定义的operator type(),我们尽量不要使用这种隐式的转化,而是显示的转换,例子就是标准库的string类并没有提供到char*的隐式转换,而是提供了一个c_str()函数。所以最好显示的原创 2017-09-07 15:32:45 · 195 阅读 · 0 评论 -
C++对象模型解析五
对象成员的效率1.对对象成员的封装本身不会带来效率的损失(如果打开优化开关)2.继承不会影响效率。3.虚拟继承的虚基类的存取会带来一定的效率损失,尽管可以通过一个非多态的对象(不需要执行器期的间接存取)进行的,但是编译器还是对对象进行了间接存取操作。间接性抑制了把所有计算都移向寄存器的优化能力。指向数据成员的指针取累的数据成员的地址得到的是器偏移值原创 2017-09-07 14:36:47 · 137 阅读 · 0 评论 -
C++对象模型解析四
对象的数据成员相关以及存取效率一个对象的大小一个对象的大小主要由以下因素决定:1.对象自身的数据成员。2.若对象没有成员变量,编译器会给器安插1Byte的空间,以使两个具体对象的地址不同。3.编译器对空的虚基类的特殊处理(不继承被安插的1Bytes)4.虚函数以及虚基类的指针5.编译器边界调整(32位机器中,对象大小调整到4的倍数)以一个例子解释class X{原创 2017-09-07 09:44:19 · 186 阅读 · 0 评论 -
解析enable_shared_from_this
enable_shared_from_this解析,作用,原理直接以代码来说明:class Connection{public: void func() { //我们的Connection对象都被shared_ptr所管理,在这个函数中我们需要获得对象的shared_ptr. //但是我们不能够这么写 //shared_ptr local_sp(this),这个创建当前原创 2017-09-23 11:52:55 · 227 阅读 · 0 评论 -
effective C++条款四十七解读
请使用traits classes表现类型信息。traits classes使得类型相关信息在编译期可用。他们以template以及templates 特化完成实现。整合重载技术后,traits classes有可能在编译期对类型执行If..else...测试.以标准库中的迭代器为例:首先根据迭代器的类型为迭代器提供卷标分类。struct input_iterator_tag{原创 2017-08-29 15:37:24 · 303 阅读 · 0 评论 -
effective C++条款四十六解读
需要类型转换时,请为模板定义class 内部的friend函数还是以一个例子作为开头:template class Rational{public:Rational(const T& numerator=0,const T&numerator=1 );}templateconst Rational operator*(const Ration原创 2017-08-29 15:10:15 · 283 阅读 · 0 评论 -
C++中模板定义与声明为什么放在同一个文件中
首先明确的是:对普通函数来说,声明放在头文件中,定义放在源文件中,其它的地方要使用该函数时,仅需要包含头文件即可,因为编译器编译时是以一个源文件作为单元编译的,当它遇到不在本文件中定义的函数时,若能够找到其声明,则会将此符号放在本编译单元的外部符号表中,链接的时候自然就可以找到该符号的定义了。对于模板。先明确,模板函数是在编译器遇到使用模板的代码时才将模板函数实例化(之前只有函数的模板定义原创 2017-08-29 14:26:23 · 1003 阅读 · 0 评论 -
effective c++条款三十七解析
绝不重新定义继承而的缺省参数值首先我们明确Non-virtual函数不应该被重新定义,所以这个条款的意思就是不要重新定义虚函数的缺省参数值。原因在于:虚函数是动态绑定的,但是缺省参数值缺失。如果缺省参数不是静态绑定,那么c++在这个问题的处理上又要像虚函数的设计一样,牺牲一定的效率。这个问题再具体一点就是,在动态绑定的时候我们需要继承了基类的缺省参数值。以下面的这个问题举例:class原创 2017-08-26 16:55:42 · 282 阅读 · 0 评论 -
effective C++条款三十六解读
绝不重新定义继承而来的Non-virtual函数我们考虑这么一种情况:class B{public: void mf();}class D:public B{public: void mf();}D x;B* pB=&x; pB->mf();//由于是静态绑定,调用的是B::mf();D* pD=&x; pB->mf();//由于静态绑定,调用的是D::mf();同原创 2017-08-26 16:45:58 · 173 阅读 · 0 评论 -
effective C++ 条款十七解读
以独立的语句讲newed对象放入智能指针用下面一段代码来解释:int priority();processWidget(shared_ptr(new Widget),priority());shared_ptr pWid=new Widget();processWidget(pwid,priority());上面第一段代码存在的问题主要是代码在调用函数processWid原创 2017-08-20 15:27:36 · 239 阅读 · 0 评论 -
effective C++ 条款十六解读
成对的使用new和delete时要采用相同的形式使用new 要搭配 delete 使用new [] 要搭配 delete [] ,究其原因主要在于 new 与new [] 申请的内存结构是不同的,new [] 申请的内存结构可能有记录大小的元素。这里需要提到的一点是,使用new的时候C++ 先调用operator new申请内存空间 再调用构造函数。在使用delete的时候C++先调原创 2017-08-20 15:21:49 · 252 阅读 · 0 评论 -
effective C++条款十五解读
在资源管理类中提供对原始资源的访问当我们用资源管理类来管理对象的时候,很多我们调用的系统API可能需要接受原始的资源参数,这时候我们的资源管理类必须提供对原始资源的访问。比如shared_ptr就提供了get方法来拿到底层的原始指针。一般来说,获取原始资源的方法有两个1.调用get函数获得原始资源。2.在类中实现类型转换函数。用一个字体管理类来分别阐述上面两种做法:原创 2017-08-20 15:08:56 · 215 阅读 · 0 评论 -
effective c++ 条款十四解读
以资源管理对象的时候小心copying行为。上一节我们讲了以资源来管理函数,显然如果有一个互斥器,我们很容易写出这样的代码。class Lock{public: Lock(Mutex* p):PMutex(p) { lock(pMutex); } ~Lock() { unlock(pMutex);原创 2017-08-20 14:40:26 · 221 阅读 · 0 评论 -
effective C++ 条款十三解读
以对象来管理资源我们这里所说的资源包括sockets 文件描述符 锁 堆空间的内存。以内容为例,裸露的指向堆空间的原始指针是不建议被使用的。以下面的代码为例:void f(){ Invesrment* pInv = createInvestmrnt(); ... delete pInv;}这段代码中createInvestment是一个工厂函数 返回一个堆空间原创 2017-08-20 14:14:11 · 188 阅读 · 0 评论