作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] 关於inline与class的问题
时间Mon Apr 13 19:01:48 2009
※ 引述《zesiva (呼拉拉)》之铭言:
1F:→ zesiva:请问那是因为是class里面的func才有这种限制吗 04/13 16:56
2F:→ zesiva:若不在class里面的func要inline也要定义在.h吗 谢谢 04/13 16:56
是的。
请回想一下 inline 的作用:在呼叫端直接展开 function 的内容。
inline int f(int i) { return i+1; }
int XXX()
{
int x = 10;
int y = f(x); // compiler 在这边把 f(x) 直接代换成 x+1
}
你可以想像一下,如果 .h 中没有 f() 的内容 { return i+1; }
那呼叫 f(x) 的时候,compiler 要把它代换成什麽?
推
QQ29:请教一下 为什麽你没去呼叫他就没事 呼叫了才说 无法解晰的 04/13 17:05
3F:→ QQ29:外部符号呢? 可以讲一下原理嘛@@ 04/13 17:06
因为没有呼叫时,compiler 就不会产生对应的 assembly code,
因此编译出来的 object file 中并不会参照到这个实际上没定义的 symbol,
这样的 object file 可以顺利连结执行,linker 也不需要报错。
建议去找一些 assembler/linker 如何运作的相关资料,会了解比较透澈
(如 computer organization 的书)
这种「呼叫才会报错」的现像可以引出一些小技巧,比如说
class T {
public:
explicit T(int i) : data(i) {}
private:
T(); // default ctor,宣告但不定义
T(const T&); // copy ctor,同样宣告但不定义
T& operator=(const T&); // 同上,宣告但不定义
int i;
};
这个 class 这样写的目的在於要求使用者一定要用 int 作为参数来建
构 T,而不能使用 default 或 copy constructor。同时它也禁止使用
者用等号来直接复制物件。需要注意的是,如果我们不写 default/copy
constructor 或 operator=,compiler 会自动帮我们生一个出来,而不
知情的使用者将会用得很愉快。为了避免这种情况,我们把它宣告在
private 区域中。
然而如果我们同时又提供了这些 function 的定义,那麽在 T 的 friend
或是 public derived class 中又可以顺利呼叫这些 function。因此这
边的作法是提供宣告但不给定义,若它们被其它 function 呼叫时,linker
就会显示错误讯息。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.121.117.50
4F:推 zesiva:非常感谢详细解答 受益很多 04/14 09:51