c++:空构造空析构的益处之一
项目开发过程中发现一个问题,有段代码,一个动态库的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++:空构造空析构的益处之一的更多相关文章
- Python Class __init__ __del__ 构造,析构过程解析【转】
转载自: http://blog.csdn.net/bbdxf/article/details/25774763 最近学习<Python参考手册>即<Learning Python& ...
- Swift的构造和析构过程
构造过程 Swift的构造过程通过定义构造器来实现. 只是与Objective-C不同的是,Swift的构造器不须要返回值,相同也不须要表明Func. 另外值得提的是,当构造器中为存储型属性赋值时.不 ...
- Effective C++: 02构造、析构、赋值运算
05:了解C++默默编写并调用哪些函数 1:一个空类,如果你自己没声明,编译器就会为它声明(编译器版本的)一个copy构造函数.一个copy assignment操作符和一个析构函数.此外如果你没有声 ...
- C++浅析——继承类中构造和析构顺序
先看测试代码,CTEST 继承自CBase,并包含一个CMember成员对象: static int nIndex = 1; class CMember { public: CMember() { p ...
- Effective C++ -----条款09:绝不在构造和析构过程中调用virtual函数
在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层).
- 【09】绝不在构造和析构过程中调用virtual方法
1.绝不在构造和析构过程中调用virtual方法,为啥? 原因很简单,对于前者,这种情况下,子类专有成分还没有构造,对于后者,子类专有成分已经销毁,因此调用的并不是子类重写的方法,这不是程序员所期望的 ...
- C++不能中断构造函数来拒绝产生对象(在构造和析构中抛出异常)
这是我的感觉,具体需要研究一下- 找到一篇文章:在构造和析构中抛出异常 测试验证在类构造和析构中抛出异常, 是否会调用该类析构. 如果在一个类成员函数中抛异常, 可以进入该类的析构函数. /// @f ...
- STL——空间配置器(构造和析构基本工具)
以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出.但若以STL的实现角度而言,第一个需要介绍的就是空间配 ...
- 魔法方法:构造和析构 - 零基础入门学习Python041
魔法方法:构造和析构 让编程改变世界 Change the world by program 构造和析构 什么是魔法方法呢?我们来系统总结下: - 魔法方法总是被双下划线包围,例如__init__ - ...
随机推荐
- 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 ...
- 7. Orcle树形结构(类似数据字典有父子类关系),查询末节点的所有记录
SELECT a.*FROM tablename aWHERE NOT EXISTS (SELECT 1 FROM tablename b WHERE b.Fid = a.id)START WITH ...
- 读取文件 读取项目里面的json
ClassPathResource resource = new ClassPathResource("properties/post2LazadaTest.json"); Fil ...
- leetcode998
class Solution: def __init__(self): self.prelist = list() def preTree(self,root:TreeNode): if root ! ...
- awk的用法
awk是什么 awk是一种优良的文本处理工具,同时也是一种脚本语言.awk的三位作者者已将它正式定义为“样式扫描和处理语言”.awk脚本允许您创建简短的程序,这些程序读取输入文件.为数据排序.处理数据 ...
- 微信小程序插件 - 开发教程
昨天(2018.3.13),微信小程序发布了重大功能更新,支持插件的使用和开发,个人预计,不超过2个月,优质服务的插件将会如雨后春笋般涌现. 这篇文章,我将会带大家,从0开始,学习如何开发和使用插件. ...
- jsfl 选择图层 选择帧 转化成mc
//打开fla var _openDOC = fl.openDocument("file:///E|TE/爱.fla"); //获取图层4的总帧 var _Length=fl.ge ...
- oracle数据库关闭了打开数据库
一.找到sqlplus
- Python基本数据类型以及字符串
基本数据类型 数字 int ,所有的功能,都放在int里 a1 = 123 a1 = 456 ...
- Java复习 之多线程
线程是一个程序中的不同路径 例子1 只有一条路径 每一个分支都是一个线程 实际上在一个时刻内 电脑只能运行一个进程 但是因为cpu运算速度很快 将时间分出来了 所以我们感觉是同时运行 创建线程的两种方 ...