项目开发过程中发现一个问题,有段代码,一个动态库的cpp代码里不包含头文件中类的空构造空析构实现,就会出现编译出的动态库依赖项少了很多。而添加后则多了好几个依赖项。下面看例子:

 ##a.h
class A{
public:
A(){}
~A(){}
void f();
private:
T1 t1;
T2 t2;
}; ##a.cpp
#include "a.h"
void A::f(){t1=0,t2=0;} ##b.cpp
#include "a.h"
int main(){
A a;
return ;
}

假设代码中的T1、T2都是来自T.so文件。我们的目的是由a.so依赖T.so,而最终的b.cpp生成的可执行文件仅仅依赖a.so即可。这样的需求,是项目开发中很常见,动态库依赖链,清晰简明。但是上面的代码却没有达到目的,因为a.so并没有依赖T.so,而b可执行文件,称之为b.out吧,b.out却需要显式依赖T.so才能编译通过。为什么?当我们尝试把A类的构造和析构写在a.cpp中时,就达到了b.out依赖a.so,a.so依赖T.so的目的。

估计你也发现原因了。t1,t2的实现和a.cpp无关。即使用到了t1,t2,但是作为动态库,运行是在被动态调用时候才运行的,编译期t1,t2来自头文件,不用考虑其实现,故而不需要依赖。而构造函数搬到了cpp中后,构造时候需要对t1,t2实现。

而在项目开发中,这样的情况很常见,代码要更复杂。养成在cpp中实现构造和析构的习惯是有必要的。

c++:空构造空析构的益处之一的更多相关文章

  1. Python Class __init__ __del__ 构造,析构过程解析【转】

    转载自: http://blog.csdn.net/bbdxf/article/details/25774763 最近学习<Python参考手册>即<Learning Python& ...

  2. Swift的构造和析构过程

    构造过程 Swift的构造过程通过定义构造器来实现. 只是与Objective-C不同的是,Swift的构造器不须要返回值,相同也不须要表明Func. 另外值得提的是,当构造器中为存储型属性赋值时.不 ...

  3. Effective C++: 02构造、析构、赋值运算

    05:了解C++默默编写并调用哪些函数 1:一个空类,如果你自己没声明,编译器就会为它声明(编译器版本的)一个copy构造函数.一个copy assignment操作符和一个析构函数.此外如果你没有声 ...

  4. C++浅析——继承类中构造和析构顺序

    先看测试代码,CTEST 继承自CBase,并包含一个CMember成员对象: static int nIndex = 1; class CMember { public: CMember() { p ...

  5. Effective C++ -----条款09:绝不在构造和析构过程中调用virtual函数

    在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层).

  6. 【09】绝不在构造和析构过程中调用virtual方法

    1.绝不在构造和析构过程中调用virtual方法,为啥? 原因很简单,对于前者,这种情况下,子类专有成分还没有构造,对于后者,子类专有成分已经销毁,因此调用的并不是子类重写的方法,这不是程序员所期望的 ...

  7. C++不能中断构造函数来拒绝产生对象(在构造和析构中抛出异常)

    这是我的感觉,具体需要研究一下- 找到一篇文章:在构造和析构中抛出异常 测试验证在类构造和析构中抛出异常, 是否会调用该类析构. 如果在一个类成员函数中抛异常, 可以进入该类的析构函数. /// @f ...

  8. STL——空间配置器(构造和析构基本工具)

    以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出.但若以STL的实现角度而言,第一个需要介绍的就是空间配 ...

  9. 魔法方法:构造和析构 - 零基础入门学习Python041

    魔法方法:构造和析构 让编程改变世界 Change the world by program 构造和析构 什么是魔法方法呢?我们来系统总结下: - 魔法方法总是被双下划线包围,例如__init__ - ...

随机推荐

  1. 42. oracle通过两张表的一个字段对应,update其中一张表的某个字段

    update A a set a.A2 = (select b.B2 from B b where b.B1=a.A1) where exists (select 1 from B where B.B ...

  2. 7. Orcle树形结构(类似数据字典有父子类关系),查询末节点的所有记录

    SELECT a.*FROM tablename aWHERE NOT EXISTS (SELECT 1 FROM tablename b WHERE b.Fid = a.id)START WITH ...

  3. 读取文件 读取项目里面的json

    ClassPathResource resource = new ClassPathResource("properties/post2LazadaTest.json"); Fil ...

  4. leetcode998

    class Solution: def __init__(self): self.prelist = list() def preTree(self,root:TreeNode): if root ! ...

  5. awk的用法

    awk是什么 awk是一种优良的文本处理工具,同时也是一种脚本语言.awk的三位作者者已将它正式定义为“样式扫描和处理语言”.awk脚本允许您创建简短的程序,这些程序读取输入文件.为数据排序.处理数据 ...

  6. 微信小程序插件 - 开发教程

    昨天(2018.3.13),微信小程序发布了重大功能更新,支持插件的使用和开发,个人预计,不超过2个月,优质服务的插件将会如雨后春笋般涌现. 这篇文章,我将会带大家,从0开始,学习如何开发和使用插件. ...

  7. jsfl 选择图层 选择帧 转化成mc

    //打开fla var _openDOC = fl.openDocument("file:///E|TE/爱.fla"); //获取图层4的总帧 var _Length=fl.ge ...

  8. oracle数据库关闭了打开数据库

    一.找到sqlplus

  9. Python基本数据类型以及字符串

    基本数据类型                数字  int ,所有的功能,都放在int里            a1 = 123            a1 = 456                 ...

  10. Java复习 之多线程

    线程是一个程序中的不同路径 例子1 只有一条路径 每一个分支都是一个线程 实际上在一个时刻内 电脑只能运行一个进程 但是因为cpu运算速度很快 将时间分出来了 所以我们感觉是同时运行 创建线程的两种方 ...