注册 登录
编程论坛 C++教室

关于inline的问题

specilize 发布于 2011-04-30 11:17, 677 次点击
在类中声明了成员函数,想在同样的头文件中定义成员函数,这些成员函数都要在前面加上inline吗
13 回复
#2
linw12252011-04-30 11:29
不用吧,类里面已经声明的的函数定义不用加inline
但是定义的时候格式是
函数返回值的类型(如 int) 类名 ::成员函数名(形式参数表)

  函数体

参考如下: void  Point::SetPoint(int a,int b)
           {   ………………}
#3
pangding2011-04-30 13:30
都可以不加。
实事上没有任何场合 inline 是必须的,而且只有很少的场合 inline 有意义。
#4
specilize2011-04-30 17:53
回复 3楼 pangding
我也觉得应该是不用的,但是我在定义了一个Query类的时候,在类定义体完后,由在同一个头文件中定义了赋值操作符
如果我不加inline,就提示multiple definition of `Query::operator=(Query const&)' ,说我重定义,但加上inline后一切正常,然后我去查了下书,发现书上答案那些成员函数定义在头文件中的都有加上inline,自己写了个测试的程序,发现不用啊,才有此疑问,如何解释我上面的问题呢,请教
#5
pangding2011-04-30 18:03
一个函数就是不能定义两遍呀。如果你已经定义了一遍的话,再定义就会出这种错误。如果加 inline 就是另一个函数了,那没事。一般都加,是因为 inline 函数在编译的时候可以嵌入代码,可以提高执行效率。

你可以写一个简化后的模型,重现一下你的那个語法错误。我们来分析一下。
#6
玩出来的代码2011-04-30 18:22
这个应该加上inline的,你的程序可能有多个文件包含Query类,当然会造成重定义,我想你的那个测试程序应该是没有多个文件包含那个头文件吧,你可以再加一个.cpp文件包含.h文件看看。
#7
specilize2011-04-30 19:20
回复 6楼 玩出来的代码
非常感谢 玩出来的代码,每次都是你出来帮我解决问题。我不明白的是,虽然多个文件包含Query类,但是我已经在头文件里加了#ifndef。。#endif了,函数定义位于这之间,为什么还是会重定义呢,第二次包含时不是已经定义了那个宏了,不就跳过了,为什么加上inline就不会呢
#8
specilize2011-04-30 19:22
回复 5楼 pangding
加inline就是另一函数请问这是什么意思啊
#9
玩出来的代码2011-04-30 19:48
假设你的程序中有main.cpp,first.cpp,Query.h,first.h等文件。
在main.cpp中有
#include"Query.h"
#include"first.h"

在first.cpp中有
#include"first.h"

在first.h中有
#include"Query.h"

那么在main与first文件中就会有相同的函数定义,这个错误应该是链接错误的。经过编译形成的main.obj,与first.obj中都会有、同一个函数的定义与代码、当 链接时就会出现重定义。

这个例子 #ifndef 的作用在main.cpp中,因为已经有Query.h了,所以在first.h中包含的Query.h是不会包含于main.cpp中的、
#10
pangding2011-04-30 23:09
回复 8楼 specilize
我觉得是,当时没细想。其实应该 玩出来 说的那样。

你问的问题都比较细,其实就属于应该自己想想的。问的价值不是很大。而且想学好 c++ 我多少觉得搞这些不太有用。
#11
pangding2011-04-30 23:19
如果写多文件编程,有很多传下来的惯常写法呀。为什么不学学这些。
有好多好写法不是说不这么写就会出问题。而是这么写能避免很多问题。

如果我的项目里提示有重定义,一般很快就能定位错误。
inline 的使用也有好多习惯上适用的场合。学的时候自己多想想。然后把心得分享出来往往比较好~~

如果是实践,一般来说程序员公认的做法就是选自己熟悉的方法来做。避免用生僻的語法。
能正确的实现比一切都重要。如果真的感觉写的很丑陋,方法是先写一个用着,将来有相关知识了再重写。
这种场合,别人一般很难猜测你的错误,因为项目一大,问题一般都隐藏的比较深。需要有对项目有一定的熟悉才能发现问题。
#12
specilize2011-05-01 07:37
回复 10楼 pangding
我就是觉得自己懂的不够多,知其然而不知其所以然,所以当遇到这些问题时,我也有想啊,但是就是搞不明白,你说
问的价值不是很大。而且想学好 c++ 我多少觉得搞这些不太有用。
请问为什么呢?可不可以详述一下,悉听教导,而且你们都是过来人,如果这些不太用,那什么才叫有用呢
#13
specilize2011-05-01 11:05
回复 11楼 pangding
受教了
#14
pangding2011-05-01 11:31
现在想想学学也不错。当年我可能也是这么学过来的,只是现在觉得有点没用了。

c++ 的语法非常细致,只有用的部分才有用。有人说过会 30%-40% 的 c++ 语法就足以做一个非常出色的c++程序员了。不过学的时候还是应该好好学。
c++ 里最有用的语法应该是模板,它可以广泛的用到很多方面。

至于你问的那个重定义问题,事实上 c 里也会出现,不只是 c++ 的问题。
通常的做法是 .h 里写声明, .cpp 里写定义。 inline 关键字一般不用,inline 的函数直接定义在类体内,使其具有 inline 属性。
你可以去看看头文件比如 vector 呀之类的,看看它是怎么处理的。积累这些方面的经验可以少走很多弯路。


现在学的时候学细一点,搞清所以然挺好的。我也喜欢这种家伙~ 不过有的时候要把好的处理方法记在心里,告诉自己结果是最重要的,原因稍带记住只是更好。毕竟将来最重要的是用最短的时间也出尽量正确的程序。
我记得 KOB 说过类似的话“你总有一天会学会足够多语言的知识,使你会很快忘记这个语言中你最近才没用过的部分。如果你不是这样,那么你会变成这样”究竟会不会这样要自己体会到才有感觉。我现在会的编程语言也就七、八种。除了 c、c++ 和 汇编 以外,其它全是脚本语言。c 和 c++ 本身很像,和汇编又很不像,所以不是很容易搞混。不过那几个脚本语言之间,确实有时候会搞串,但出问题的时候调试还是比较容易发现。

不过最近有一件事挺让我感慨的。
我用了几年的 vi 了,现在才开始深入学习 emacs(以前会一些基本的,但不多)。现在才用了几天,一直在努力克服打完字按一下<ESC>的毛病,现在已经取得了比较好的成效。偶尔在 emacs 里按几下 jkl 我倒不是很在意。不过我现在在 vi 里却经常不自觉地用 c-x o 切屏。以前天天在 vi 里 c-w w 的按,才用了几天 emacs 就按乱了。好在这些键没映射到危险的动作上。
有没有其他双修的朋友有类似的经验?可以一起分享分享~~
1