日志20191204(4)

//编译式依赖 类的前置声明 
void test2() {
	int a = 1;
	int b = 2;
	//assert(sizeof(double) == sizeof(int));
	//static_assert(a == b, "error");	//用法错误,编译时期无法确定
	static_assert(sizeof(double) == sizeof(int), "error");
	//assert(a == b);
}

/*
编译式依赖 类的前置声明
总之:如果x.h发生了变化,所有x的对象所在的文件都需要重新编译,
但是如果x.cpp发生了变化而x.h没有发生变化,那么x的对象所在的文件
不需要重新编译。
一句话:尽可能只在.cpp中包含其他类的头文件。
另外:对于c++库,系统函数没有必要尽量只包含在.cpp中,因为c++库不会变化。

对于c++来说,主要分为.h和.cpp文件
当修改某一个.h文件时,所有依赖该.h的文件都需要重新编译
同理修改一个.cpp文件时,所有依赖该.cpp文件都需要重新编译,
然而,.cpp文件编译会生成.o文件,链接时候调用,另一方面,
直接依赖.cpp文件进行编译的比较少,所有修改文件时,尽可能
只在.cpp文件中修改,将其他文件的编译式依赖降到最低。

实例如下:
原型:
//a.h
class A{...};

//b.h
#include "a.h"
class B{
	...
public:
	void func(A a);
private:
	A a;
}

当a.h发生变化时,则b必须要重新编译,b中有A a这个成员,
同理,其他所有依赖a.h的文件都需要重新编译(含A a等)。

方案一:
//a.h
class A{...};

//b.h
class A;
class B{
	...
public:
	void func(A a);
	~B(){ delete a };
private:
	A* a;
}

此时类B就不需要知道A的大小,因为其成员只是一个指针(32位为4字节)。
当a发生修改时,b就不需要重新编译,如果b.cpp中调用了a->func()函数,
b.cpp需要重新编译,b.cpp依赖的是a.o这个库,a发生了改变,需要
重新编译a和b即可,但是所有依赖b.h的文件都不需要编译,避免了连锁反应,
只在一层关系中终止,满足松耦合的关系。
a发生了变化,b依赖a,b需要重新编译,如果c只依赖了b.h,而b.cpp中用到了
a.h,b.h中没有用到a.h,所以c不需要重新编译。

总之:如果x.h发生了变化,所有x的对象所在的文件都需要重新编译,
但是如果x.cpp发生了变化而x.h没有发生变化,那么x的对象所在的文件
不需要重新编译。
一句话:尽可能只在.cpp中包含其他类的头文件。
另外:对于c++库,系统函数没有必要尽量只包含在.cpp中,因为c++库不会变化。

*/

/*
如果想禁止一个类拷贝或者=
class A{
...
private:
	A(const A& rhs);	//只声明,不定义,私有
	A& operator=(const A& rhs);//同上
}
或者
class B{
...
private:
	B(const B& rhs) = delete;
	B& operator=(const B& rhs) = delete;
}

*/


int main() {
	//test2();

	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值